From 6e2db418c550946580689d29bf1cd7e1365a4200 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 14 Apr 2021 02:38:54 +0200 Subject: [PATCH] added some more unit tests for string splitting and formatting --- Tests/Content/TestFont.xnb | Bin 0 -> 288688 bytes Tests/FontTests.cs | 103 +++++++++++++++++++++++++++++++++++++ Tests/FormattingTests.cs | 35 ------------- Tests/TestGame.cs | 5 +- 4 files changed, 107 insertions(+), 36 deletions(-) create mode 100644 Tests/Content/TestFont.xnb create mode 100644 Tests/FontTests.cs delete mode 100644 Tests/FormattingTests.cs diff --git a/Tests/Content/TestFont.xnb b/Tests/Content/TestFont.xnb new file mode 100644 index 0000000000000000000000000000000000000000..2aa06aca12572487ce4ec1314b372efb92109e3c GIT binary patch literal 288688 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
8hKak2<4$(z z<&&20I=`J@lFCinI^~m|A0>6W&X1EaZ%y<}>!#;lo0RX9UP^d&m5;KV&!pv3KB+CA zn3Fy!|CDDcD@`AP+|bujJ=60k&(z1#^Q`;-w_EMD5kf)mId?$lz=1={a^MnHRB$B` zI&=w?KnX5^60QV7hn|65ZtehyCkH;H_oOF=VR!b!@=2JxSRK!OEwEj`i!`okYW|}J z{1`*AMO^S_!Rnj9oBKZ1jv>Xh$ZevRyj|zq;5;-nXT_D|(+hq?4hjC;bKij9!SnqQ zyn!Ru{D;s1&DHVT*N9D?edil+)Zx(_Gj8iRdd1kxGi+L5`Xp=~gO51mPmCYe>WfV! z{5S9!Hne*co5pR(C-4oA*x@_!u!){%+(CSM!P={+i#qDdIEEeifmJhfcun(Ho9Eg! zV8ecf&Q@H_p=Dk0OW4Y9VU4BwxwzWsl}Y|5x4He6<;L1$ul4S+&$aoIdjEodpc8ZW zDZR?YFXHhHm-xr#B~Tpi>2DtKx{=|g584EFKtOs>b8 zE9Bp=J$DDKW&V#sT|?A$Z?zydeUHuWsC&!vzw*)ksource code for more in-depth explanations of their functionality or the website for tutorials and API documentation."); + formatted.Split(this.font, 90, 0.1F); + Assert.AreEqual(formatted.DisplayString, "Select the demo you want to see below using \nyour mouse, touch input, your keyboard or a \ncontroller. Check the demos' source code for \nmore in-depth explanations of their \nfunctionality or the website for tutorials and \nAPI documentation."); + + var tokens = new[] { + "Select the demo you want to see below using \nyour mouse, touch input, your keyboard or a \ncontroller. Check the demos' ", + string.Empty, + "source code", + string.Empty, + " for \nmore in-depth explanations of their \nfunctionality or the ", + string.Empty, + "website", + string.Empty, + " for tutorials and \nAPI documentation." + }; + for (var i = 0; i < tokens.Length; i++) + Assert.AreEqual(formatted.Tokens[i].DisplayString, tokens[i]); + } + + [Test] + public void TestLongLineSplit() { + const string expectedDisplay = "This_is_a_really_long_line_to_s\nee_if_splitting_without_spaces_\nworks_properly._I_also_want_to_\nsee_if_it_works_across_multiple\n_lines_or_just_on_the_first_one. \nBut after this, I want the text to \ncontinue normally before \nchanging_back_to_being_really_\nlong_oh_yes"; + + Assert.AreEqual(this.font.SplitString( + "This_is_a_really_long_line_to_see_if_splitting_without_spaces_works_properly._I_also_want_to_see_if_it_works_across_multiple_lines_or_just_on_the_first_one. But after this, I want the text to continue normally before changing_back_to_being_really_long_oh_yes", + 65, 0.1F), expectedDisplay); + + var formatted = this.formatter.Tokenize(this.font, + "This_is_a_really_long_line_to_see_if_splitting_without_spaces_works_properly._I_also_want_to_see_if_it_works_across_multiple_lines_or_just_on_the_first_one. But after this, I want the text to continue normally before changing_back_to_being_really_long_oh_yes"); + formatted.Split(this.font, 65, 0.1F); + Assert.AreEqual(formatted.DisplayString, expectedDisplay); + + var tokens = new[] { + "This_is_a_really_long_line_to_s\nee_if_", + "splitting", + "_without_spaces_\nworks_properly._I_also_want_to_\nsee_if_it_works_across_multiple\n_", + "lines", + "_or_just_on_the_first_one. \nBut after this, I want the ", + "text", + " to \ncontinue normally before \nchanging_back_", + "to", + "_being_really_\nlong_oh_yes" + }; + for (var i = 0; i < tokens.Length; i++) + Assert.AreEqual(formatted.Tokens[i].DisplayString, tokens[i]); + } + + [Test] + public void TestMacros() { + this.formatter.Macros.Add(new Regex(""), (f, m, r) => ""); + this.formatter.Macros.Add(new Regex(""), (f, m, r) => "blue"); + this.formatter.Macros.Add(new Regex(""), (f, m, r) => ""); + const string strg = "This text uses a bunch of non-breaking~spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into text."; + const string goal = "This text uses a bunch of non-breaking\u00A0spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into blue text."; + Assert.AreEqual(this.formatter.ResolveMacros(strg), goal); + } + + [Test] + public void TestFormatting() { + this.formatter.AddImage("Test", new TextureRegion((Texture2D) null, 0, 8, 24, 24)); + const string strg = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; + var ret = this.formatter.Tokenize(this.font, strg); + Assert.AreEqual(ret.Tokens.Length, 13); + Assert.AreEqual(ret.DisplayString, "Lorem Ipsum \u2003 is simply dummy text of the \u2003 printing and typesetting \u2003 industry. Lorem Ipsum has been the industry's standard dummy text \u2003 ever since the \u2003 1500s, when \u2003\u2003\u2003\u2003\u2003\u2003\u2003 an unknown printer took a galley of type and scrambled it to make a type specimen book."); + Assert.AreEqual(ret.AllCodes.Length, 12); + } + + } +} \ No newline at end of file diff --git a/Tests/FormattingTests.cs b/Tests/FormattingTests.cs deleted file mode 100644 index b732e59..0000000 --- a/Tests/FormattingTests.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Text.RegularExpressions; -using Microsoft.Xna.Framework.Graphics; -using MLEM.Formatting; -using MLEM.Formatting.Codes; -using MLEM.Textures; -using NUnit.Framework; - -namespace Tests { - public class FormattingTests { - - [Test] - public void TestMacros() { - var formatter = new TextFormatter(); - formatter.Macros.Add(new Regex(""), (f, m, r) => ""); - formatter.Macros.Add(new Regex(""), (f, m, r) => "blue"); - formatter.Macros.Add(new Regex(""), (f, m, r) => ""); - const string strg = "This text uses a bunch of non-breaking~spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into text."; - const string goal = "This text uses a bunch of non-breaking\u00A0spaces to see if macros work. Additionally, it uses a macro that resolves into a bunch of other macros and then, at the end, into blue text."; - Assert.AreEqual(formatter.ResolveMacros(strg), goal); - } - - [Test] - public void TestFormatting() { - using var game = TestGame.Create(); - var formatter = new TextFormatter(); - formatter.AddImage("Test", new TextureRegion((Texture2D) null, 0, 8, 24, 24)); - const string strg = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book."; - var ret = formatter.Tokenize(game.UiSystem.Style.Font, strg); - Assert.AreEqual(ret.Tokens.Length, 13); - Assert.AreEqual(ret.DisplayString, "Lorem Ipsum \u2003 is simply dummy text of the \u2003 printing and typesetting \u2003 industry. Lorem Ipsum has been the industry's standard dummy text \u2003 ever since the \u2003 1500s, when \u2003\u2003\u2003\u2003\u2003\u2003\u2003 an unknown printer took a galley of type and scrambled it to make a type specimen book."); - Assert.AreEqual(ret.AllCodes.Length, 12); - } - - } -} \ No newline at end of file diff --git a/Tests/TestGame.cs b/Tests/TestGame.cs index 3b27675..0bc4688 100644 --- a/Tests/TestGame.cs +++ b/Tests/TestGame.cs @@ -1,4 +1,6 @@ -using MLEM.Data.Content; +using Microsoft.Xna.Framework.Graphics; +using MLEM.Data.Content; +using MLEM.Font; using MLEM.Startup; namespace Tests { @@ -12,6 +14,7 @@ namespace Tests { protected override void LoadContent() { base.LoadContent(); this.RawContent = new RawContentManager(this.Services, this.Content.RootDirectory); + this.UiSystem.Style.Font = new GenericSpriteFont(LoadContent("TestFont")); } public static TestGame Create() {