// Copyright Epic Games, Inc. All Rights Reserved. #include "CoreMinimal.h" #include "HAL/FileManager.h" #include "Misc/Paths.h" #include "Misc/Guid.h" #include "Misc/AutomationTest.h" #include "Internationalization/InternationalizationManifest.h" #include "Internationalization/InternationalizationArchive.h" #include "LocTextHelper.h" IMPLEMENT_SIMPLE_AUTOMATION_TEST(FLocTextHelperTest, "System.Core.Misc.LocText Helper", EAutomationTestFlags::EditorContext | EAutomationTestFlags::ClientContext | EAutomationTestFlags::EngineFilter) struct FLocTextHelperTestSourceEntry { FString Namespace; FString Key; FString SourceText; }; struct FLocTextHelperTestTranslationEntry { FString Namespace; FString Key; FString SourceText; FString TranslationText; }; bool FLocTextHelperTest::RunTest(const FString& Parameters) { const int32 NumTestEntries = 100; const FString TestingPath = FPaths::GameAgnosticSavedDir() / TEXT("LocTextHelperTest_") + FGuid::NewGuid().ToString(); TArray ForeignCultures; ForeignCultures.Add(TEXT("fr")); ForeignCultures.Add(TEXT("de")); FLocTextHelper LocTestHelper(TestingPath, TEXT("Test.manifest"), TEXT("Test.archive"), TEXT("en"), ForeignCultures, nullptr); LocTestHelper.LoadAll(ELocTextHelperLoadFlags::Create); TArray TestSources; TestSources.Reserve(NumTestEntries); TArray EnglishTranslations; EnglishTranslations.Reserve(NumTestEntries); TArray FrenchTranslations; FrenchTranslations.Reserve(NumTestEntries); TArray GermanTranslations; GermanTranslations.Reserve(NumTestEntries); // Create test data for (int32 Index = 0; Index < NumTestEntries; ++Index) { FLocTextHelperTestSourceEntry& TestSourceEntry = TestSources[TestSources.AddDefaulted()]; TestSourceEntry.Namespace = TEXT("Test"); TestSourceEntry.Key = FString::Printf(TEXT("Test_%d"), Index + 1); TestSourceEntry.SourceText = FString::Printf(TEXT("Source Text %d"), Index + 1); FLocTextHelperTestTranslationEntry& TestEnglishEntry = EnglishTranslations[EnglishTranslations.AddDefaulted()]; TestEnglishEntry.Namespace = TestSourceEntry.Namespace; TestEnglishEntry.Key = TestSourceEntry.Key; TestEnglishEntry.SourceText = TestSourceEntry.SourceText; TestEnglishEntry.TranslationText = FString::Printf(TEXT("English Text %d"), Index + 1); FLocTextHelperTestTranslationEntry& TestFrenchEntry = FrenchTranslations[FrenchTranslations.AddDefaulted()]; TestFrenchEntry.Namespace = TestSourceEntry.Namespace; TestFrenchEntry.Key = TestSourceEntry.Key; TestFrenchEntry.SourceText = TestEnglishEntry.TranslationText; TestFrenchEntry.TranslationText = FString::Printf(TEXT("French Text %d"), Index + 1); FLocTextHelperTestTranslationEntry& TestGermanEntry = GermanTranslations[GermanTranslations.AddDefaulted()]; TestGermanEntry.Namespace = TestSourceEntry.Namespace; TestGermanEntry.Key = TestSourceEntry.Key; TestGermanEntry.SourceText = TestEnglishEntry.TranslationText; TestGermanEntry.TranslationText = FString::Printf(TEXT("German Text %d"), Index + 1); } // Populate database with test data for (int32 Index = 0; Index < NumTestEntries; ++Index) { { const FLocTextHelperTestSourceEntry& TestSource = TestSources[Index]; FManifestContext Ctx; Ctx.Key = TestSource.Key; LocTestHelper.AddSourceText(TestSource.Namespace, FLocItem(TestSource.SourceText), Ctx); } { FLocTextHelperTestTranslationEntry& TestEnglishEntry = EnglishTranslations[Index]; LocTestHelper.AddTranslation(TEXT("en"), TestEnglishEntry.Namespace, TestEnglishEntry.Key, nullptr, FLocItem(TestEnglishEntry.SourceText), FLocItem(TestEnglishEntry.TranslationText), false); } { FLocTextHelperTestTranslationEntry& TestFrenchEntry = FrenchTranslations[Index]; LocTestHelper.AddTranslation(TEXT("fr"), TestFrenchEntry.Namespace, TestFrenchEntry.Key, nullptr, FLocItem(TestFrenchEntry.SourceText), FLocItem(TestFrenchEntry.TranslationText), false); } { FLocTextHelperTestTranslationEntry& TestGermanEntry = GermanTranslations[Index]; LocTestHelper.AddTranslation(TEXT("de"), TestGermanEntry.Namespace, TestGermanEntry.Key, nullptr, FLocItem(TestGermanEntry.SourceText), FLocItem(TestGermanEntry.TranslationText), false); } } // Check that all the test data can be found for (int32 Index = 0; Index < NumTestEntries; ++Index) { const FLocTextHelperTestSourceEntry& TestSourceEntry = TestSources[Index]; const FLocTextHelperTestTranslationEntry& TestEnglishEntry = EnglishTranslations[Index]; const FLocTextHelperTestTranslationEntry& TestFrenchEntry = FrenchTranslations[Index]; const FLocTextHelperTestTranslationEntry& TestGermanEntry = GermanTranslations[Index]; { TSharedPtr ManifestEntry = LocTestHelper.FindSourceText(TestSourceEntry.Namespace, TestSourceEntry.Key, &TestSourceEntry.SourceText); if (!ManifestEntry.IsValid()) { AddError(FString::Printf(TEXT("Failed to find expected source text: '%s', '%s', '%s'."), *TestSourceEntry.Namespace, *TestSourceEntry.Key, *TestSourceEntry.SourceText)); } } auto TestTranslationLookup = [this, &LocTestHelper](const FString& InCultureName, const FLocTextHelperTestSourceEntry& InSourceEntry, const FLocTextHelperTestTranslationEntry& InTranslationEntry) { TSharedPtr FoundArchiveEntry = LocTestHelper.FindTranslation(InCultureName, InTranslationEntry.Namespace, InTranslationEntry.Key, nullptr); if (!FoundArchiveEntry.IsValid() || !FoundArchiveEntry->Translation.Text.Equals(InTranslationEntry.TranslationText, ESearchCase::CaseSensitive)) { AddError(FString::Printf(TEXT("Failed to find expected translation for '%s': '%s', '%s', '%s', '%s'."), *InCultureName, *InTranslationEntry.Namespace, *InTranslationEntry.Key, *InTranslationEntry.SourceText, *InTranslationEntry.TranslationText)); } FoundArchiveEntry = LocTestHelper.FindTranslation(InCultureName, InSourceEntry.Namespace, InSourceEntry.Key, nullptr); if (!FoundArchiveEntry.IsValid() || !FoundArchiveEntry->Translation.Text.Equals(InTranslationEntry.TranslationText, ESearchCase::CaseSensitive)) { AddError(FString::Printf(TEXT("Failed to find expected translation for '%s': '%s', '%s', '%s', '%s'."), *InCultureName, *InSourceEntry.Namespace, *InSourceEntry.Key, *InSourceEntry.SourceText, *InTranslationEntry.TranslationText)); } FLocItem FoundSourceText; FLocItem FoundTranslationText; LocTestHelper.GetExportText(InCultureName, InTranslationEntry.Namespace, InTranslationEntry.Key, nullptr, ELocTextExportSourceMethod::NativeText, FLocItem(InTranslationEntry.SourceText), FoundSourceText, FoundTranslationText); if (!FoundTranslationText.Text.Equals(InTranslationEntry.TranslationText, ESearchCase::CaseSensitive) && !FoundSourceText.Text.Equals(InTranslationEntry.SourceText, ESearchCase::CaseSensitive)) { AddError(FString::Printf(TEXT("Failed to find expected export text for '%s': '%s', '%s', '%s', '%s'."), *InCultureName, *InTranslationEntry.Namespace, *InTranslationEntry.Key, *InTranslationEntry.SourceText, *InTranslationEntry.TranslationText)); } LocTestHelper.GetExportText(InCultureName, InSourceEntry.Namespace, InSourceEntry.Key, nullptr, ELocTextExportSourceMethod::NativeText, FLocItem(InSourceEntry.SourceText), FoundSourceText, FoundTranslationText); if (!FoundTranslationText.Text.Equals(InTranslationEntry.TranslationText, ESearchCase::CaseSensitive) && !FoundSourceText.Text.Equals(InSourceEntry.SourceText, ESearchCase::CaseSensitive)) { AddError(FString::Printf(TEXT("Failed to find expected export text for '%s': '%s', '%s', '%s', '%s'."), *InCultureName, *InTranslationEntry.Namespace, *InTranslationEntry.Key, *InTranslationEntry.SourceText, *InTranslationEntry.TranslationText)); } }; TestTranslationLookup(TEXT("en"), TestSourceEntry, TestEnglishEntry); TestTranslationLookup(TEXT("fr"), TestSourceEntry, TestFrenchEntry); TestTranslationLookup(TEXT("de"), TestSourceEntry, TestGermanEntry); } // Check that all the test data can be enumerated { int32 EnumeratedCount = 0; LocTestHelper.EnumerateSourceTexts([&EnumeratedCount](TSharedRef InManifestEntry) -> bool { ++EnumeratedCount; return true; }, true); if (NumTestEntries != EnumeratedCount) { AddError(FString::Printf(TEXT("Failed to enumerate the expected number of source texts. Expected: %d. Actual: %d."), NumTestEntries, EnumeratedCount)); } } auto TestTranslationEnumeration = [this, &LocTestHelper, &NumTestEntries](const FString& InCultureName) { int32 EnumeratedCount = 0; LocTestHelper.EnumerateTranslations(InCultureName, [&EnumeratedCount](TSharedRef InArchiveEntry) -> bool { ++EnumeratedCount; return true; }, true); if (NumTestEntries != EnumeratedCount) //-V547 { AddError(FString::Printf(TEXT("Failed to enumerate the expected number of translations for '%s'. Expected: %d. Actual: %d."), *InCultureName, NumTestEntries, EnumeratedCount)); } }; TestTranslationEnumeration(TEXT("en")); TestTranslationEnumeration(TEXT("fr")); TestTranslationEnumeration(TEXT("de")); IFileManager::Get().DeleteDirectory(*TestingPath, true, true); return true; }