Skip to content

Commit

Permalink
Web: Tests:
Browse files Browse the repository at this point in the history
+ Added new SpellCheckTest() and submodule (common/Tests/Frontend.Translations.Tests/dictionaries)
+ Split tests on categories FastRunning|LongRunning
+ Added new build/run.translations.spellcheck.test.bat
  • Loading branch information
AlexeySafronov committed Dec 21, 2021
1 parent 649e1b4 commit 4274e3a
Show file tree
Hide file tree
Showing 9 changed files with 222 additions and 2 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@
path = products/ASC.Files/Server/DocStore
url = https://github.com/ONLYOFFICE/document-templates
branch = main/community-server
[submodule "common/Tests/Frontend.Translations.Tests/dictionaries"]
path = common/Tests/Frontend.Translations.Tests/dictionaries
url = https://github.com/ONLYOFFICE/dictionaries
2 changes: 2 additions & 0 deletions build/run.translations.spellcheck.test.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PUSHD %~dp0..
dotnet test common\Tests\Frontend.Translations.Tests\Frontend.Translations.Tests.csproj --filter Name~SpellCheckTest -l:html -r TestsResults
2 changes: 1 addition & 1 deletion build/run.translations.tests.bat
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
PUSHD %~dp0..
dotnet test common\Tests\Frontend.Translations.Tests\Frontend.Translations.Tests.csproj -l:html -r TestsResults
dotnet test common\Tests\Frontend.Translations.Tests\Frontend.Translations.Tests.csproj --filter "TestCategory=FastRunning" -l:html -r TestsResults
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
<PackageReference Include="NUnit3TestAdapter" Version="3.16.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
<PackageReference Include="UTF.Unknown" Version="2.5.0" />
<PackageReference Include="WeCantSpell.Hunspell" Version="3.0.1" />
</ItemGroup>

</Project>
75 changes: 74 additions & 1 deletion common/Tests/Frontend.Translations.Tests/LocalesTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

using UtfUnknown;

using WeCantSpell.Hunspell;

namespace Frontend.Translations.Tests
{
public class Tests
Expand Down Expand Up @@ -246,12 +248,70 @@ from file in Directory.EnumerateFiles(clientDir, "*.jsx", SearchOption.AllDirect
}

[Test]
[Category("FastRunning")]
public void ParseJsonTest()
{
Assert.AreEqual(0, ParseJsonErrors.Count, string.Join("\r\n", ParseJsonErrors.Select(e => $"File path = '{e.Path}' failed to parse with error: '{e.Exception.Message}'")));
}

[Test]
[Category("LongRunning")]
public void SpellCheckTest()
{
const string dictionariesPath = @"..\..\..\dictionaries";
var i = 0;
var errorsCount = 0;
var message = $"Next keys have spell check issues:\r\n\r\n";

var groupByLng = TranslationFiles
.GroupBy(t => t.Language)
.Select(g => new
{
Language = g.Key,
Files = g.ToList()
})
.ToList();

foreach (var group in groupByLng)
{
try
{
var language = SpellCheck.GetDictionaryLanguage(group.Language);

using (var dictionaryStream = File.OpenRead(Path.Combine(dictionariesPath, language, $"{language}.dic")))
using (var affixStream = File.OpenRead(Path.Combine(dictionariesPath, language, $"{language}.aff")))
{
var dictionary = WordList.CreateFromStreams(dictionaryStream, affixStream);

foreach (var g in group.Files)
{
foreach (var item in g.Translations)
{
var result = SpellCheck.HasSpellIssues(item.Value, dictionary);

if (result.HasProblems)
{
message += $"{++i}. lng='{group.Language}' file='{g.FilePath}'\r\nkey='{item.Key}' value='{item.Value}'\r\nIncorrect words:\r\n{string.Join("\r\n", result.SpellIssues.Select(issue => $"'{issue.Word}' Suggestion: '{issue.Suggestions.FirstOrDefault()}'"))}\r\n\r\n";
errorsCount++;
}
}
}


}
}
catch (NotSupportedException)
{
// Skip not supported
continue;
}
}

Assert.AreEqual(0, errorsCount, message);
}

[Test]
[Category("FastRunning")]
public void DublicatesFilesByMD5HashTest()
{
var duplicatesByMD5 = TranslationFiles
Expand All @@ -261,10 +321,11 @@ public void DublicatesFilesByMD5HashTest()
.OrderByDescending(itm => itm.Count)
.ToList();

Assert.AreEqual(0, duplicatesByMD5.Count, "Dublicates by MD5 hash:\r\n" + string.Join("\r\n", duplicatesByMD5.Select(d => $"\r\nMD5='{d.Key}\r\n{string.Join("\r\n", d.Paths.Select(p => p))}'")));
Assert.AreEqual(0, duplicatesByMD5.Count, "Dublicates by MD5 hash:\r\n" + string.Join("\r\n", duplicatesByMD5.Select(d => $"\r\nMD5='{d.Key}':\r\n{string.Join("\r\n", d.Paths.Select(p => p))}'")));
}

[Test]
[Category("FastRunning")]
public void FullEnDublicatesTest()
{
var fullEnDuplicates = TranslationFiles
Expand All @@ -281,6 +342,7 @@ public void FullEnDublicatesTest()
}

[Test]
[Category("FastRunning")]
public void EnDublicatesByContentTest()
{
var allRuTranslations = TranslationFiles
Expand Down Expand Up @@ -359,6 +421,7 @@ public static void SaveNotFoundLanguage(string existJsonPath, string notExistJso
}

[Test]
[Category("FastRunning")]
public void NotAllLanguageTranslatedTest()
{
var groupedByLng = TranslationFiles
Expand Down Expand Up @@ -435,6 +498,7 @@ public static void SaveNotFoundKeys(string pathToJson, List<string> newKeys)
}

[Test]
[Category("FastRunning")]
public void NotTranslatedKeysTest()
{
var message = $"Next languages are not equal 'en' by translated keys count:\r\n\r\n";
Expand Down Expand Up @@ -481,6 +545,7 @@ public void NotTranslatedKeysTest()
}

[Test]
[Category("FastRunning")]
public void NotFoundKeysTest()
{
var allEnKeys = TranslationFiles
Expand All @@ -502,6 +567,7 @@ public void NotFoundKeysTest()
}

[Test]
[Category("FastRunning")]
public void UselessTranslationKeysTest()
{
var allEnKeys = TranslationFiles
Expand All @@ -524,6 +590,7 @@ public void UselessTranslationKeysTest()
}

[Test]
[Category("FastRunning")]
public void UselessModuleTranslationKeysTest()
{
var notFoundi18nKeys = new List<KeyValuePair<string, List<string>>>();
Expand Down Expand Up @@ -605,6 +672,7 @@ public void UselessModuleTranslationKeysTest()
}

[Test]
[Category("FastRunning")]
public void NotTranslatedCommonKeysTest()
{
var message = $"Some i18n-keys are not found in COMMON translations: \r\nKeys: \r\n\r\n";
Expand Down Expand Up @@ -703,6 +771,7 @@ public string GetWorkspace(string path)
}

[Test]
[Category("FastRunning")]
public void EmptyValueKeysTest()
{
// Uncomment if new keys are available
Expand Down Expand Up @@ -806,6 +875,7 @@ public void EmptyValueKeysTest()
}

[Test]
[Category("FastRunning")]
public void LanguageTranslatedPercentTest()
{
var message = $"Next languages translated less then 100%:\r\n\r\n";
Expand Down Expand Up @@ -852,6 +922,7 @@ public void LanguageTranslatedPercentTest()
}

[Test]
[Category("FastRunning")]
public void NotTranslatedToastsTest()
{
var message = $"Next text not translated in toasts:\r\n\r\n";
Expand All @@ -874,6 +945,7 @@ public void NotTranslatedToastsTest()
}

[Test]
[Category("FastRunning")]
public void WrongTranslationVariablesTest()
{
var message = $"Next keys have wrong variables:\r\n\r\n";
Expand Down Expand Up @@ -951,6 +1023,7 @@ public void WrongTranslationVariablesTest()
}

[Test]
[Category("FastRunning")]
public void TranslationsEncodingTest()
{
/*//Convert to UTF-8
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace Frontend.Translations.Tests.Models
{
public class SpellCheckResult
{
private Regex wordRegex = new Regex(@"\p{L}+", RegexOptions.Multiline | RegexOptions.Compiled);

public SpellCheckResult(string text)
{
Text = text;

Words = wordRegex.Matches(text).Select(m => m.Value)
.Where(w => !string.IsNullOrEmpty(w))
.Where(w => !w.StartsWith("{{"))
.ToList();

SpellIssues = new List<SpellIssue>();
}

public string Text { get; }
public List<string> Words { get; }

public List<SpellIssue> SpellIssues { get; set; }

public bool HasProblems
{
get
{
return SpellIssues.Any(issue => issue.Suggestions.Any());
}
}
}
}
16 changes: 16 additions & 0 deletions common/Tests/Frontend.Translations.Tests/Models/SpellIssue.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Collections.Generic;

namespace Frontend.Translations.Tests.Models
{
public class SpellIssue
{
public SpellIssue(string word, IEnumerable<string> suggestions)
{
Word = word;
Suggestions = suggestions;
}

public string Word { get; }
public IEnumerable<string> Suggestions { get; }
}
}
88 changes: 88 additions & 0 deletions common/Tests/Frontend.Translations.Tests/SpellCheck.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
using System;

using WeCantSpell.Hunspell;

namespace Frontend.Translations.Tests
{
public static class SpellCheck
{
public static Models.SpellCheckResult HasSpellIssues(string text, WordList dictionary)
{
var result = new Models.SpellCheckResult(text);

foreach (var word in result.Words)
{
if (!dictionary.Check(word))
{
result.SpellIssues.Add(new Models.SpellIssue(word, dictionary.Suggest(word)));
}
}

return result;
}

public static string GetDictionaryLanguage(string lng)
{
// az,bg,cs,de,el,en,en-US,es,fi,fr,it,ja,ko,lo,lv,nl,pl,pt,pt-BR,ro,ru,sk,sl,tr,uk,vi,zh-CN
switch (lng)
{
case "az":
return "az_Latn_AZ";
case "bg":
return "bg_BG";
case "cs":
return "cs_CZ";
case "de":
return "de_DE";
case "el":
return "el_GR";
case "en":
return "en_GB";
case "en-US":
return "en_US";
case "es":
return "es_ES";
//case "fi":
// return "";
case "fr":
return "fr_FR";
case "it":
return "it_IT";
//case "ja":
// return "";
case "ko":
return "ko_KR";
//case "lo":
// return "";
case "lv":
return "lv_LV";
case "nl":
return "nl_NL";
case "pl":
return "pl_PL";
case "pt":
return "pt_PT";
case "pt-BR":
return "pt_BR";
case "ro":
return "ro_RO";
case "ru":
return "ru_RU";
case "sk":
return "sk_SK";
case "sl":
return "sl_SI";
case "tr":
return "tr_TR";
case "uk":
return "uk_UA";
case "vi":
return "vi_VN";
//case "zh-CN":
// return "";
default:
throw new NotSupportedException();
}
}
}
}
1 change: 1 addition & 0 deletions common/Tests/Frontend.Translations.Tests/dictionaries
Submodule dictionaries added at 8222c8

0 comments on commit 4274e3a

Please sign in to comment.