return function()
	local CorePackages = game:GetService("CorePackages")
    local Logging = require(CorePackages.Logging)
	local NumberLocalization = require(CorePackages.Localization.NumberLocalization)

	local RoundingBehaviour = require(script.Parent.RoundingBehaviour)

	local function checkLocale(locale, responseMapping)
		for input, output in pairs(responseMapping) do
			expect(NumberLocalization.localize(input, locale)).to.equal(output)
		end
	end

	local function checkValid_en_zh(locale)
		checkLocale(locale, {
			[0] = "0",
			[1] = "1",
			[25] = "25",
			[364] = "364",
			[4120] = "4,120",
			[57860] = "57,860",
			[624390] = "624,390",
			[7857000] = "7,857,000",
			[-12345678] = "-12,345,678",
			[23987.45678] = "23,987.45678",
			[-12.3456] = "-12.3456",
			[-23987.45678] = "-23,987.45678",
		})
	end

	describe("NumberLocalization.localize", function()
		it("should default to en-us when locale is not recognized", function()
			local logs = Logging.capture(function()
				checkValid_en_zh("bad_locale")
			end)
			expect(string.match(logs.warnings[1], "^Warning: Locale not found:") ~= nil).to.equal(true)
		end)

		it("should default to en-us when locale is nil", function()
			local logs = Logging.capture(function()
				checkValid_en_zh(nil)
			end)
			expect(string.match(logs.warnings[1], "^Warning: Locale not found:") ~= nil).to.equal(true)
		end)

		it("should default to en-us when locale is empty", function()
			local logs = Logging.capture(function()
				checkValid_en_zh("")
			end)
			expect(string.match(logs.warnings[1], "^Warning: Locale not found:") ~= nil).to.equal(true)
		end)

		it("should localize correctly. (en-us)", function()
			checkValid_en_zh("en-us")
		end)

		it("should localize correctly. (en-gb)", function()
			checkValid_en_zh("en-gb")
        end)

        it("should localize correctly. (zh-cn)", function()
			checkValid_en_zh("zh-cn")
		end)

		it("should localize correctly. (zh-tw)", function()
			checkValid_en_zh("zh-tw")
        end)
	end)

	describe("NumberLocalization.abbreviate", function()
		it("should round towards zero when using RoundingBehaviour.Truncate", function()
			local roundToZeroMap = {
				[0] = "0",
				[1] = "1",
				[25] = "25",
				[364] = "364",
				[4120] = "4.1K",
				[57860] = "57.8K",
				[624390] = "624K",
				[999999] = "999K",
				[7857000] = "7.8M",
				[8e7] = "80M",
				[9e8] = "900M",
				[1e9] = "1B",
				[1e12] = "1,000B",
				[-0] = "0",
				[-1] = "-1",
				[-25] = "-25",
				[-364] = "-364",
				[-4120] = "-4.1K",
				[-57860] = "-57.8K",
				[-624390] = "-624K",
				[-999999] = "-999K",
				[-7857000] = "-7.8M",
				[-8e7] = "-80M",
				[-9e8] = "-900M",
				[-1e9] = "-1B",
				[-1e12] = "-1,000B",
				[1.1] = "1.1",
				[1499.99] = "1.4K",
				[-1.1] = "-1.1",
				[-1499.99] = "-1.4K",
			}

			for input, output in pairs(roundToZeroMap) do
				expect(NumberLocalization.abbreviate(input, "en-us", RoundingBehaviour.Truncate)).to.equal(output)
			end
		end)
	end)
end
