return function()
	local ErrorQueue = require(script.Parent.ErrorQueue)
	local CorePackages = game:GetService("CorePackages")

	local tutils = require(CorePackages.Packages.tutils)

	local errorsToAdd = {
		[1] = {
			key = "test",
			value = 2.33,
		},
		[2] = {
			key = "test",
			value = 2,
		},
		[3] = {
			key = "test",
			value = 3.14,
		},
		[4] = {
			key = "test2",
			value = 123,
		},
		[5] = {
			key = "test2",
			value = 456,
		},
		[6] = {
			key = "test3",
			value = "something",
		},
	}

	describe("queueErrorLimit", function()
		it("should report errors correctly when the total error limit is reached", function()
			local expectedErrorsReported = {
				["test"] = {
					data = 2.33,
					count = 3,
				},
				["test2"] = {
					data = 123,
					count = 2,
				},
				["test3"] = {
					data = "something",
					count = 1,
				},
			}

			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueErrorLimit = 6,
			})

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			expect(reportCount).to.equal(3)
			for errorKey, expectedError in pairs(expectedErrorsReported) do
				expect(tutils.deepEqual(expectedError, errorsReported[errorKey])).to.equal(true)
			end
		end)

		it("should not report errors before the total error limit is reached", function()
			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueErrorLimit = 6,
			})

			for index = 1, 5 do
				local error = errorsToAdd[index]
				errorQueue:addError(error.key, error.value)
			end

			expect(reportCount).to.equal(0)
			expect(tutils.deepEqual(errorsReported, {})).to.equal(true)
		end)
	end)

	describe("queueKeyLimit", function()
		it("should report errors correctly when the total key limit is reached", function()
			local expectedErrorsReported = {
				["test"] = {
					data = 2.33,
					count = 3,
				},
				["test2"] = {
					data = 123,
					count = 2,
				},
				["test3"] = {
					data = "something",
					count = 1,
				},
			}

			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueKeyLimit = 3,
				queueErrorLimit = 100,
			})

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			expect(reportCount).to.equal(3)
			for errorKey, expectedError in pairs(expectedErrorsReported) do
				expect(tutils.deepEqual(expectedError, errorsReported[errorKey])).to.equal(true)
			end
		end)

		it("should not report errors before the total key limit is reached", function()
			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueKeyLimit = 4,
				queueErrorLimit = 100,
			})

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			expect(reportCount).to.equal(0)
			expect(tutils.deepEqual(errorsReported, {})).to.equal(true)
		end)
	end)

	describe("queueTimeLimit", function()
		it("should report errors correctly when the total time limit is reached", function()
			local expectedErrorsReported = {
				["test"] = {
					data = 2.33,
					count = 3,
				},
				["test2"] = {
					data = 123,
					count = 2,
				},
				["test3"] = {
					data = "something",
					count = 1,
				},
			}

			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueTimeLimit = 0.5,
				queueErrorLimit = 100,
				queueKeyLimit = 100,
			})

			errorQueue:startTimer()

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			errorQueue:_onRenderStep(0.5)

			expect(reportCount).to.equal(3)
			for errorKey, expectedError in pairs(expectedErrorsReported) do
				expect(tutils.deepEqual(expectedError, errorsReported[errorKey])).to.equal(true)
			end

			errorQueue:stopTimer()
		end)

		it("should not report errors before the total time limit is reached", function()
			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueTimeLimit = 2,
				queueErrorLimit = 100,
				queueKeyLimit = 100,
			})

			errorQueue:startTimer()

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			errorQueue:_onRenderStep(1)

			expect(reportCount).to.equal(0)
			expect(tutils.deepEqual(errorsReported, {})).to.equal(true)

			errorQueue:stopTimer()
		end)
	end)

	describe("reportAllErrors", function()
		it("should report all errors correctly when called", function()
			local expectedErrorsReported = {
				["test"] = {
					data = 2.33,
					count = 3,
				},
				["test2"] = {
					data = 123,
					count = 2,
				},
				["test3"] = {
					data = "something",
					count = 1,
				},
			}

			local errorsReported = {}
			local reportCount = 0
			local reportMethod = function(errorKey, errorData, errorCount)
				reportCount = reportCount + 1
				errorsReported[errorKey] = {
					data = errorData,
					count = errorCount,
				}
			end

			local errorQueue = ErrorQueue.new(reportMethod, {
				queueTimeLimit = 100,
				queueErrorLimit = 100,
				queueKeyLimit = 100,
			})

			errorQueue:startTimer()

			for _, error in ipairs(errorsToAdd) do
				errorQueue:addError(error.key, error.value)
			end

			expect(reportCount).to.equal(0)

			errorQueue:reportAllErrors()

			expect(reportCount).to.equal(3)
			for errorKey, expectedError in pairs(expectedErrorsReported) do
				expect(tutils.deepEqual(expectedError, errorsReported[errorKey])).to.equal(true)
			end

			errorQueue:stopTimer()
		end)
	end)
end
