return function()local H=(game:GetService("\082\101\112\108\105\099\097\116\101\100\083\116\111\114\097\103\101")).Packages.Monolith local b=require(H.Collection)describe("\067\111\110\115\116\114\117\099\116\111\114",function()it("\115\104\111\117\108\100 \098\101 \097\098\108\101 \116\111 \098\101 \105\110\115\116\097\110\116\105\097\116\101\100",function()local H=b.new();(expect(H)).to.be.ok()end)end)describe("\069\110\117\109\101\114\097\098\108\101 \073\110\116\101\114\102\097\099\101",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \069\110\117\109\101\114\097\116\111\114 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Enumerator()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \069\110\117\109\101\114\097\116\111\114 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)end)describe("\067\111\108\108\101\099\116\105\111\110 \073\110\116\101\114\102\097\099\101",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \067\111\110\116\097\105\110\115 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Contains()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \067\111\110\116\097\105\110\115 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \067\111\110\116\097\105\110\115\065\108\108 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.ContainsAll()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \067\111\110\116\097\105\110\115\065\108\108 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \067\111\110\116\097\105\110\115\065\110\121 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.ContainsAny()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \067\111\110\116\097\105\110\115\065\110\121 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \067\111\117\110\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Count()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \067\111\117\110\116 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \069\109\112\116\121 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Empty()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \069\109\112\116\121 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \084\111\065\114\114\097\121 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.ToArray()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \084\111\065\114\114\097\121 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \084\111\084\097\098\108\101 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.ToTable()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \084\111\084\097\098\108\101 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \065\100\100 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Add()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \065\100\100 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \065\100\100\065\108\108 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.AddAll()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \065\100\100\065\108\108 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \067\108\101\097\114 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Clear()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \067\108\101\097\114 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \082\101\109\111\118\101 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.Remove()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \082\101\109\111\118\101 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \082\101\109\111\118\101\065\108\108 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.RemoveAll()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \082\101\109\111\118\101\065\108\108 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \082\101\116\097\105\110\065\108\108 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local H=b.new();(expect(function()H.RetainAll()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \082\101\116\097\105\110\065\108\108 \109\117\115\116 \098\101 \111\118\101\114\114\105\100\100\101\110 \105\110 \102\105\114\115\116 \099\111\110\099\114\101\116\101 \115\117\098\099\108\097\115\115\046 \067\097\108\108\101\100 \100\105\114\101\099\116\108\121 \102\114\111\109 \067\111\108\108\101\099\116\105\111\110\046")end)end)end
--- Tests for the @{Collection} interface.

return function()
	local module = game:GetService("ReplicatedStorage").Packages.Monolith
	local Collection = require(module.Collection)

	describe("Constructor", function()
		it("should be able to be instantiated", function()
			local collection = Collection.new()
			expect(collection).to.be.ok()
		end)
	end)

	describe("Enumerable Interface", function()
		it("should error when Enumerator is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Enumerator()
			end).to.throw(
				"Abstract method Enumerator must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)
	end)

	describe("Collection Interface", function()
		it("should error when Contains is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Contains()
			end).to.throw(
				"Abstract method Contains must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when ContainsAll is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.ContainsAll()
			end).to.throw(
				"Abstract method ContainsAll must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when ContainsAny is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.ContainsAny()
			end).to.throw(
				"Abstract method ContainsAny must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when Count is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Count()
			end).to.throw(
				"Abstract method Count must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when Empty is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Empty()
			end).to.throw(
				"Abstract method Empty must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when ToArray is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.ToArray()
			end).to.throw(
				"Abstract method ToArray must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when ToTable is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.ToTable()
			end).to.throw(
				"Abstract method ToTable must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when Add is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Add()
			end).to.throw(
				"Abstract method Add must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when AddAll is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.AddAll()
			end).to.throw(
				"Abstract method AddAll must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when Clear is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Clear()
			end).to.throw(
				"Abstract method Clear must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when Remove is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.Remove()
			end).to.throw(
				"Abstract method Remove must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when RemoveAll is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.RemoveAll()
			end).to.throw(
				"Abstract method RemoveAll must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)

		it("should error when RetainAll is not overridden", function()
			local collection = Collection.new()
			expect(function()
				collection.RetainAll()
			end).to.throw(
				"Abstract method RetainAll must be overridden in first concrete subclass. Called directly from Collection."
			)
		end)
	end)
end
