return function() local Text = require(script.Parent.Text) describe("GetTextBounds", function() it("should return a bounds of padding width and font-size height when the string is empty", function() local bounds = Text.GetTextBounds("", Enum.Font.SourceSans, 18, Vector2.new(1000, 1000)) expect(bounds.X).to.equal(Text._TEMP_PATCHED_PADDING.x) expect(bounds.Y).to.equal(18 + Text._TEMP_PATCHED_PADDING.y) end) it("should return the height and width of a string as one line with large bounds", function() local bounds = Text.GetTextBounds("One Two Three", Enum.Font.SourceSans, 18, Vector2.new(1000, 1000)) expect(bounds.Y).to.equal(18 + Text._TEMP_PATCHED_PADDING.y) end) it("should return the height of the string as multiple lines with short bounds", function() local bounds = Text.GetTextBounds("One Two Three Four", Enum.Font.SourceSans, 18, Vector2.new(32, 1000)) expect(bounds.Y > 18).to.equal(true) end) end) describe("GetTextHeight", function() it("should return height equal to font size when string is empty", function() local height = Text.GetTextHeight("", Enum.Font.SourceSans, 18, 0) expect(height).to.equal(18 + Text._TEMP_PATCHED_PADDING.y) end) end) describe("GetTextWidth", function() it("should return width equal to 1 when string is empty", function() local width = Text.GetTextWidth("", Enum.Font.SourceSans, 18, 18) expect(width).to.equal(Text._TEMP_PATCHED_PADDING.x) end) end) describe("Truncate", function() it("should return empty string", function() local emptyQuery = Text.Truncate("", Enum.Font.SourceSans, 18, 0, "...") expect(emptyQuery).to.be.a("string") expect(emptyQuery).to.equal("") end) it("should return empty string for not empty box", function() local emptyQuery = Text.Truncate("", Enum.Font.SourceSans, 18, 50, "...") expect(emptyQuery).to.be.a("string") expect(emptyQuery).to.equal("") end) it("should truncate with ...", function() local reallyLongQuery = Text.Truncate( "One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve", Enum.Font.SourceSans, 18, 100, "...") expect(reallyLongQuery).to.equal("One Two Thre...") end) it("should truncate without a ...", function() local reallyLongQueryNoOverflowMarker = Text.Truncate( "One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve", Enum.Font.SourceSans, 18, 100) expect(reallyLongQueryNoOverflowMarker).to.equal("One Two Three ") end) it("should not truncate", function() local shouldFitQuery = Text.Truncate("One Two", Enum.Font.SourceSans, 18, 100) expect(shouldFitQuery).to.equal("One Two") end) it("should not truncate, off by one check", function() local oneCharQuery = Text.Truncate("O", Enum.Font.SourceSans, 18, 100) expect(oneCharQuery).to.equal("O") end) it("should truncate, off by one check", function() local oneCharNoRoomQuery = Text.Truncate("O", Enum.Font.SourceSans, 18, 0) expect(oneCharNoRoomQuery).to.equal("") end) it("should perform a negative width check", function() local shouldFitQuery = Text.Truncate("One Two", Enum.Font.SourceSans, 18, -100, "...") expect(shouldFitQuery).to.equal("") end) itFIXME("should truncate long graphemes properly", function() -- 11-byte rainbow flag grapheme -- Flag, zero-space-joiner, rainbow local rainbowFlag = utf8.char(127987) .. utf8.char(8205) .. utf8.char(127752) local oneFlagWithinLimit = Text.Truncate( rainbowFlag, Enum.Font.SourceSans, 18, 100, "...") expect(oneFlagWithinLimit).to.equal(rainbowFlag) local twoRainbowFlags = rainbowFlag .. rainbowFlag local twoFlagsAreFine = Text.Truncate( twoRainbowFlags, Enum.Font.SourceSans, 18, 100, "...") expect(twoFlagsAreFine).to.equal(twoRainbowFlags) local fourRainbowFlags = twoRainbowFlags .. twoRainbowFlags local fourFlagsIsTooLong = Text.Truncate( fourRainbowFlags, Enum.Font.SourceSans, 18, 100, "...") expect(fourFlagsIsTooLong).to.equal(twoRainbowFlags .. "...") -- With --fflags==true fails because of truncation end) end) describe("TruncateTextLabel", function() it("should use text label attributes to truncate text", function() local screenGui = Instance.new("ScreenGui") local textLabel = Instance.new("TextLabel") textLabel.Size = UDim2.new(0, 100, 0, 32) textLabel.Text = "One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve" textLabel.Font = Enum.Font.SourceSans textLabel.TextSize = 18 textLabel.Parent = screenGui Text.TruncateTextLabel(textLabel) expect(textLabel.Text).to.equal("One Two Three ") end) end) describe("TrimString", function() it("Should trim the string properly 1", function() local trimmedInput = Text.Trim("") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 2", function() local trimmedInput = Text.Trim(" ") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 3", function() local trimmedInput = Text.Trim("ab") local expected = "ab" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 4", function() local trimmedInput = Text.Trim(" ab ") local expected = "ab" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 5", function() local trimmedInput = Text.Trim(" a b ") local expected = "a b" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 6", function() local trimmedInput = Text.Trim("\r\n\t\f a\r\n\t\f ") local expected = "a" expect(trimmedInput).to.equal(expected) end) it("Should trim the string with unicode characters properly", function() local trimmedInput = Text.Trim("πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 7", function() local trimmedInput = Text.Trim(" πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ ") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) it("Should trim the string properly 8", function() local trimmedInput = Text.Trim("\n πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ \n") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) end) describe("RightTrimString", function() it("Should right trim the string properly 1", function() local trimmedInput = Text.RightTrim("") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 2", function() local trimmedInput = Text.RightTrim(" ") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 3", function() local trimmedInput = Text.RightTrim("ab") local expected = "ab" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 4", function() local trimmedInput = Text.RightTrim(" ab ") local expected = " ab" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 5", function() local trimmedInput = Text.RightTrim(" a b ") local expected = " a b" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 6", function() local trimmedInput = Text.RightTrim("\r\n\t\f a\r\n\t\f ") local expected = "\r\n\t\f a" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string with unicode characters properly", function() local trimmedInput = Text.RightTrim("πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 7", function() local trimmedInput = Text.RightTrim(" πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ ") local expected = " πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) it("Should right trim the string properly 8", function() local trimmedInput = Text.RightTrim("\n πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ \n") local expected = "\n πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) end) describe("LeftTrimString", function() it("Should left trim the string properly 1", function() local trimmedInput = Text.LeftTrim("") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 2", function() local trimmedInput = Text.LeftTrim(" ") local expected = "" expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 3", function() local trimmedInput = Text.LeftTrim("ab") local expected = "ab" expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 4", function() local trimmedInput = Text.LeftTrim(" ab ") local expected = "ab " expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 5", function() local trimmedInput = Text.LeftTrim(" a b ") local expected = "a b " expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 6", function() local trimmedInput = Text.LeftTrim("\r\n\t\f a\r\n\t\f ") local expected = "a\r\n\t\f " expect(trimmedInput).to.equal(expected) end) it("Should left trim the string with unicode characters properly", function() local trimmedInput = Text.LeftTrim("πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“" expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly 7", function() local trimmedInput = Text.LeftTrim(" πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ ") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€γ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ " expect(trimmedInput).to.equal(expected) end) it("Should left trim the string properly", function() local trimmedInput = Text.LeftTrim("\n πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ \n") local expected = "πŸ˜€πŸ‘©πŸΌβ€πŸ«πŸ˜­γΌπŸ˜€ \nγ§πŸ˜ΉπŸ€•γ‚πŸ‘©πŸ»β€πŸŽ“ \n" expect(trimmedInput).to.equal(expected) end) end) describe("SpaceNormalize", function() it("should remove multiple spaces between words", function() local a = "This is not a normal sentence." expect(Text.SpaceNormalize(a)).to.equal("This is not a normal sentence.") end) it("should remove leading and trailing whitespace", function() local a = " SpaceTabSpaceTab " expect(Text.SpaceNormalize(a)).to.equal("SpaceTabSpaceTab") end) it("should not change a string with no whitespace", function() local a = "There'sNo%Whit.e\\space--InThis." expect(Text.SpaceNormalize(a)).to.equal(a) end) it("should remove all whitespace in a string that is nothing but whitespace", function() local a = " " expect(Text.SpaceNormalize(a)).to.equal("") end) it("should handle the case where the string is empty", function() local a = "" expect(Text.SpaceNormalize(a)).to.equal(a) end) it("should throw an error if called an a non-string type", function() local a = { first = 1, second = 2 } expect(function() Text.SpaceNormalize(a) end).to.throw() end) end) describe("Split", function() local function tableEquals(tb1, tb2) local tables = { tb1, tb2 } for _,tb in ipairs(tables) do for key in pairs(tb) do if tb1[key] ~= tb2[key] then return false end end end return true end it("should return the correct table for your standard use case", function() local a = "this,is,comma,separated" local pattern = "," local expectedResult = { [1] = "this", [2] = "is", [3] = "comma", [4] = "separated", } expect(tableEquals(Text.Split(a, pattern), expectedResult)).to.equal(true) end) it("should not remove whitespace", function() local a = " SpaceTab , , Space" local pattern = "," local expectedResult = { [1] = " SpaceTab ", [2] = " ", [3] = " Space", } expect(tableEquals(Text.Split(a, pattern), expectedResult)).to.equal(true) end) it("should treat regular expressions as plain text", function() local a = "Notyour^%s+normalstring.Thisisasecondsentence." local b = "." local c = "^%s+" local d = "%A" local expectedB = { [1] = "Notyour^%s+normalstring", [2] = "Thisisasecondsentence", [3] = "", } local expectedC = { [1] = "Notyour", [2] = "normalstring.Thisisasecondsentence." } local expectedD = { [1] = "Notyour^%s+normalstring.Thisisasecondsentence." } expect(tableEquals(Text.Split(a, b), expectedB)).to.equal(true) expect(tableEquals(Text.Split(a, c), expectedC)).to.equal(true) expect(tableEquals(Text.Split(a, d), expectedD)).to.equal(true) end) it("should work when pattern is not in string", function() local a = "The pattern you are looking for does not exist." local pattern = "," local expectedResult = { [1] = "The pattern you are looking for does not exist.", } expect(tableEquals(Text.Split(a, pattern), expectedResult)).to.equal(true) end) it("should work when called on an empty string", function() local a = "" local pattern = "," local expectedResult = { [1] = "", } expect(tableEquals(Text.Split(a, pattern), expectedResult)).to.equal(true) end) it("should throw an error if called on an empty pattern", function() local a = "The pattern definitely doesn't exist here." local pattern = "" expect(function() Text.Split(a, pattern) end).to.throw() end) it("should throw an error if called an a non-string type", function() local a = { first = 1, second = 2 } local b = "an actual string" expect(function() Text.Split(a, b) end).to.throw() expect(function() Text.Split(b, a) end).to.throw() end) end) end