return function()local V=(game:GetService("\082\101\112\108\105\099\097\116\101\100\083\116\111\114\097\103\101")).Packages.Monolith local F=require(V.AbstractList)local B=require(V.ArrayList)local n=F.new()n.__index=n function n.new(V)local F=setmetatable({},n)F.array={}if V~=nil then local B=type(V)if B=="\116\097\098\108\101"then if type(V.Enumerator)=="\102\117\110\099\116\105\111\110"then for V,B in V:Enumerator()do F.array[#F.array+1]=B end else for V,B in ipairs(V)do F.array[#F.array+1]=B end end else error(string.format("\067\097\110\110\111\116 \099\111\110\115\116\114\117\099\116 \083\111\109\101\076\105\115\116 \102\114\111\109 \116\121\112\101 \037\115\046",B))end end return F end n.Enumerator=B.Enumerator n.Add=B.Add n.Remove=B.Remove n.First=B.First n.Get=B.Get n.IndexOf=B.IndexOf n.Last=B.Last n.LastIndexOf=B.LastIndexOf n.Sub=B.Sub n.Delete=B.Delete n.Insert=B.Insert n.InsertAll=B.InsertAll n.Pop=B.Pop n.Push=B.Push n.Set=B.Set n.Shift=B.Shift n.Unshift=B.Unshift describe("\067\111\110\115\116\114\117\099\116\111\114",function()it("\115\104\111\117\108\100 \099\114\101\097\116\101 \097\110 \101\109\112\116\121 \065\098\115\116\114\097\099\116\076\105\115\116",function()local V=F.new();(expect(V)).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()describe("\069\110\117\109\101\114\097\116\111\114",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 V=F.new();(expect(function()V.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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)end)describe("\067\111\108\108\101\099\116\105\111\110 \073\110\116\101\114\102\097\099\101",function()describe("\082\101\113\117\105\114\101\100 \077\101\116\104\111\100\115",function()describe("\067\111\110\116\097\105\110\115",function()it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110\121 \101\108\101\109\101\110\116 \119\104\101\110 \101\109\112\116\121",function()local V=n.new();(expect(V:Contains(0))).to.equal(false)end)it("\115\104\111\117\108\100 \102\105\110\100 \097\110 \101\108\101\109\101\110\116 \119\104\101\110 \116\104\097\116 \101\108\101\109\101\110\116 \101\120\105\115\116\115",function()local V=n.new({1;2,3,4;5});(expect(V:Contains(1))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110 \101\108\101\109\101\110\116 \119\104\101\110 \116\104\097\116 \101\108\101\109\101\110\116 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1;2,3;4,5});(expect(V:Contains(0))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110 \101\108\101\109\101\110\116 \117\110\116\105\108 \105\116 \105\115 \097\100\100\101\100",function()local V=n.new({1,2,3;4,5});(expect(V:Contains(0))).to.equal(false)V:Add(0);(expect(V:Contains(0))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111 \108\111\110\103\101\114 \102\105\110\100 \097\110 \101\108\101\109\101\110\116 \119\104\101\110 \105\116\115 \114\101\109\111\118\101\100",function()local V=n.new({1,2;3;4,5});(expect(V:Contains(1))).to.equal(true)V:Remove(1);(expect(V:Contains(1))).to.equal(false)end)end)describe("\067\111\110\116\097\105\110\115\065\108\108",function()it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110\121 \101\108\101\109\101\110\116 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1;2;3;4;5});(expect(V:ContainsAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \102\105\110\100 \097\108\108 \122\101\114\111 \101\108\101\109\101\110\116\115 \119\104\101\110 \116\104\101 \112\114\111\118\105\100\101\100 \067\111\108\108\101\099\116\105\111\110 \105\115 \101\109\112\116\121",function()local V=n.new({1;2,3,4;5})local F=n.new();(expect(V:ContainsAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \102\105\110\100 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \097\108\108 \111\102 \116\104\101 \101\108\101\109\101\110\116\115 \101\120\105\115\116",function()local V=n.new({1;2;3,4;5})local F=n.new({1;2,3;4,5});(expect(V:ContainsAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \102\105\110\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \105\116 \101\120\105\115\116\115",function()local V=n.new({1;2;3;4;5})local F=n.new({3});(expect(V:ContainsAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \111\110\101 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1,2,4;5})local F=n.new({1;2;3,4;5});(expect(V:ContainsAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \105\116 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1;2;4,5})local F=n.new({3});(expect(V:ContainsAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \101\108\101\109\101\110\116\115 \117\110\116\105\108 \116\104\101\121 \097\114\101 \097\100\100\101\100",function()local V=n.new()local F=n.new({1;2});(expect(V:ContainsAll(F))).to.equal(false)V:Add(1);(expect(V:ContainsAll(F))).to.equal(false)V:Add(2);(expect(V:ContainsAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111 \108\111\110\103\101\114 \102\105\110\100 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \116\104\101\121 \097\114\101 \114\101\109\111\118\101\100",function()local V=n.new({1,2;3,4;5})local F=n.new({1;2,3,4;5});(expect(V:ContainsAll(F))).to.equal(true)V:Remove(1);(expect(V:ContainsAll(F))).to.equal(false)end)end)describe("\067\111\110\116\097\105\110\115\065\110\121",function()it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110\121 \101\108\101\109\101\110\116 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1,2;3;4,5});(expect(V:ContainsAny(F))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \097\110\121 \101\108\101\109\101\110\116 \119\104\101\110 \116\104\101 \112\114\111\118\105\100\101\100 \067\111\108\108\101\099\116\105\111\110 \105\115 \101\109\112\116\121",function()local V=n.new({1,2;3,4;5})local F=n.new();(expect(V:ContainsAny(F))).to.equal(false)end)it("\115\104\111\117\108\100 \102\105\110\100 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \116\104\101 \101\108\101\109\101\110\116\115 \101\120\105\115\116",function()local V=n.new({1,2;3,4,5})local F=n.new({1;2,3,4,5});(expect(V:ContainsAny(F))).to.equal(true)end)it("\115\104\111\117\108\100 \102\105\110\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \105\116 \101\120\105\115\116\115",function()local V=n.new({1;2,3;4,5})local F=n.new({3});(expect(V:ContainsAny(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \115\111\109\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \111\110\108\121 \111\110\101 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1;2,4,5})local F=n.new({1;2,3,4;5});(expect(V:ContainsAny(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \105\116 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1;2;4,5})local F=n.new({3});(expect(V:ContainsAny(F))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \102\105\110\100 \101\108\101\109\101\110\116\115 \117\110\116\105\108 \116\104\101\121 \097\114\101 \097\100\100\101\100",function()local V=n.new()local F=n.new({1;2});(expect(V:ContainsAny(F))).to.equal(false)V:Add(1);(expect(V:ContainsAny(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111 \108\111\110\103\101\114 \102\105\110\100 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \116\104\101\121 \097\114\101 \097\108\108 \114\101\109\111\118\101\100",function()local V=n.new({1,2;3;4;5})local F=n.new({1;2,3;4;5});(expect(V:ContainsAny(F))).to.equal(true)V:Remove(1);(expect(V:ContainsAny(F))).to.equal(true)V:Clear();(expect(V:ContainsAny(F))).to.equal(false)end)end)describe("\067\111\117\110\116",function()it("\115\104\111\117\108\100 \099\111\117\110\116 \122\101\114\111 \119\104\101\110 \101\109\112\116\121",function()local V=n.new();(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \099\111\117\110\116 \116\104\101 \110\117\109\098\101\114 \111\102 \101\108\101\109\101\110\116\115 \105\110 \116\104\101 \065\098\115\116\114\097\099\116\076\105\115\116",function()local V=n.new({1,2;3;4,5});(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \099\111\117\110\116 \110\101\119 \101\108\101\109\101\110\116\115 \119\104\101\110 \116\104\101\121 \097\114\101 \097\100\100\101\100",function()local V=n.new()local F=10;(expect(V:Count())).to.equal(0)for F=1,F,1 do V:Add(F);(expect(V:Count())).to.equal(F)end;(expect(V:Count())).to.equal(F)end)it("\115\104\111\117\108\100 \110\111\116 \099\111\117\110\116 \101\108\101\109\101\110\116\115 \097\102\116\101\114 \116\104\101\121 \097\114\101 \114\101\109\111\118\101\100",function()local V=n.new({1;2,3;4,5})local F=V:Count();(expect(F)).to.equal(5)while F>0 do V:Pop()local B=F F=V:Count();(expect(F)).to.equal(B-1)end end)it("\115\104\111\117\108\100 \099\111\117\110\116 \122\101\114\111 \097\102\116\101\114 \098\101\105\110\103 \099\108\101\097\114\101\100",function()local V=n.new({1,2;3,4,5});(expect(V:Count())).to.equal(5)V:Clear();(expect(V:Count())).to.equal(0)end)end)describe("\069\109\112\116\121",function()it("\115\104\111\117\108\100 \098\101 \101\109\112\116\121 \119\104\101\110 \105\110\115\116\097\110\116\105\097\116\101\100",function()local V=n.new();(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \098\101 \101\109\112\116\121 \119\105\116\104 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1});(expect(V:Empty())).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \098\101 \101\109\112\116\121 \119\105\116\104 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1,2;3,4,5});(expect(V:Empty())).to.equal(false)end)it("\115\104\111\117\108\100 \110\111 \108\111\110\103\101\114 \098\101 \101\109\112\116\121 \097\102\116\101\114 \097\110 \101\108\101\109\101\110\116 \105\115 \097\100\100\101\100",function()local V=n.new();(expect(V:Empty())).to.equal(true)V:Add(1);(expect(V:Empty())).to.equal(false)end)it("\115\104\111\117\108\100 \098\101 \101\109\112\116\121 \097\102\116\101\114 \097\108\108 \101\108\101\109\101\110\116\115 \097\114\101 \114\101\109\111\118\101\100",function()local V=n.new({1,2,3;4,5})local F=V:Count()while F>0 do(expect(V:Empty())).to.equal(false)V:Pop()F=V:Count()end;(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \098\101 \101\109\112\116\121 \097\102\116\101\114 \098\101\105\110\103 \099\108\101\097\114\101\100",function()local V=n.new({1;2,3,4;5});(expect(V:Empty())).to.equal(false)V:Clear();(expect(V:Empty())).to.equal(true)end)end)describe("\084\111\065\114\114\097\121",function()it("\115\104\111\117\108\100 \114\101\116\117\114\110 \097 \116\097\098\108\101",function()local V=n.new();(expect(V:ToArray())).to.be.a("\116\097\098\108\101")end)it("\115\104\111\117\108\100 \099\114\101\097\116\101 \097 \116\097\098\108\101 \111\102 \116\104\101 \115\097\109\101 \115\105\122\101",function()local V=n.new({1;2;3,4;5});(expect(#V:ToArray())).to.equal(V:Count())end)it("\115\104\111\117\108\100 \099\114\101\097\116\101 \097\110 \101\109\112\116\121 \116\097\098\108\101 \119\104\101\110 \101\109\112\116\121",function()local V=n.new();(expect(#V:ToArray())).to.equal(0)end)it("\115\104\111\117\108\100 \099\114\101\097\116\101 \097 \116\097\098\108\101 \119\105\116\104 \116\104\101 \115\097\109\101 \101\108\101\109\101\110\116\115 \097\110\100 \111\114\100\101\114 \111\102 \101\110\117\109\101\114\097\116\105\111\110",function()local V=n.new({1;2;3,4,5})local F=V:ToArray();(expect(#F)).to.equal(V:Count())for F,B in ipairs(F)do(expect(B)).to.equal(V:Get(F))end end)it("\115\104\111\117\108\100 \112\114\111\118\105\100\101 \111\110\108\121 \097\114\114\097\121 \105\110\100\101\120\097\098\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1,2;3,4,5})local F=V:ToArray()local B=0 for V in pairs(F)do B=B+1 end;(expect(B)).to.equal(#F)end)end)describe("\084\111\084\097\098\108\101",function()it("\115\104\111\117\108\100 \112\114\111\118\105\100\101 \116\104\101 \115\097\109\101 \114\101\112\114\101\115\101\110\116\097\116\105\111\110 \097\115 \084\111\065\114\114\097\121",function()local V=n.new({1,2;3,4;5})local F=V:ToArray()local B=V:ToTable();(expect(B)).to.be.a("\116\097\098\108\101");(expect(#B)).to.equal(#F)for V,B in pairs(B)do(expect(B)).to.equal(F[V])end end)end)end)describe("\079\112\116\105\111\110\097\108 \077\101\116\104\111\100\115",function()describe("\065\100\100",function()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 V=F.new();(expect(function()V.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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\065\100\100\065\108\108",function()it("\115\104\111\117\108\100 \097\100\100 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1,2,3;4;5})V:AddAll(F);(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \097\100\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1})V:AddAll(F);(expect(V:Count())).to.equal(1)end)it("\115\104\111\117\108\100 \097\100\100 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \110\111\116 \101\109\112\116\121",function()local V=n.new({1;2;3;4,5})local F=n.new({6;7;8,9,0})V:AddAll(F);(expect(V:Count())).to.equal(10)end)it("\115\104\111\117\108\100 \097\100\100 \111\110\101 \101\108\101\109\101\110\116 \119\104\101\110 \110\111\116 \101\109\112\116\121",function()local V=n.new({1,2;3,4;5})local F=n.new({6})V:AddAll(F);(expect(V:Count())).to.equal(6)end)it("\115\104\111\117\108\100 \097\100\100 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \116\111 \116\104\101 \101\110\100",function()local V=n.new({1,2,3;4;5})local F=n.new({6;7;8;9;10})V:AddAll(F);(expect(V:Get(6))).to.equal(6);(expect(V:Get(7))).to.equal(7);(expect(V:Get(8))).to.equal(8);(expect(V:Get(9))).to.equal(9);(expect(V:Get(10))).to.equal(10)end)it("\115\104\111\117\108\100 \097\100\100 \111\110\101 \101\108\101\109\101\110\116 \116\111 \116\104\101 \101\110\100",function()local V=n.new({1;2,3;4,5})local F=n.new({6})V:AddAll(F);(expect(V:Get(6))).to.equal(6)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \097\100\100\105\110\103 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new()local F=n.new({6,7;8;9,10});(expect(V:AddAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \097\100\100\105\110\103 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new()local F=n.new({6});(expect(V:AddAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \097\100\100 \109\117\108\116\105\112\108\101 \100\117\112\108\105\099\097\116\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1,1;1,1;1})local F=n.new({1;1,1,1,1})V:AddAll(F);(expect(V:Count())).to.equal(10)end)it("\115\104\111\117\108\100 \097\100\100 \111\110\101 \100\117\112\108\105\099\097\116\101 \101\108\101\109\101\110\116",function()local V=n.new({1,1,1,1;1})local F=n.new({1})V:AddAll(F);(expect(V:Count())).to.equal(6)end)end)describe("\067\108\101\097\114",function()it("\115\104\111\117\108\100 \099\108\101\097\114 \097\108\108 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2,3,4,5});(expect(V:Empty())).to.equal(false)V:Clear();(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \099\108\101\097\114 \119\104\101\110 \097\108\114\101\097\100\121 \101\109\112\116\121",function()local V=n.new()V:Clear();(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \099\108\101\097\114 \119\105\116\104 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1})V:Clear();(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \099\108\101\097\114 \119\105\116\104 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2;3;4,5})V:Clear();(expect(V:Empty())).to.equal(true)end)it("\115\104\111\117\108\100 \099\108\101\097\114 \119\105\116\104 \100\117\112\108\105\099\097\116\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1,1,1;1;1})V:Clear();(expect(V:Empty())).to.equal(true)end)end)describe("\082\101\109\111\118\101",function()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 V=F.new();(expect(function()V.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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\082\101\109\111\118\101\065\108\108",function()it("\115\104\111\117\108\100 \115\117\099\099\101\115\115\102\117\108\108\121 \097\116\116\101\109\112\116 \116\111 \114\101\109\111\118\101 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1,2,3,4;5});(expect(function()V:RemoveAll(F)end)).never.to.throw()end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \097\116\116\101\109\112\116\105\110\103 \116\111 \114\101\109\111\118\101 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1;2;3,4,5});(expect(V:RemoveAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\109\111\118\101 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1})local F=n.new({1})V:RemoveAll(F);(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\109\111\118\105\110\103 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1})local F=n.new({1});(expect(V:RemoveAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\109\111\118\101 \119\104\101\110 \116\104\101\114\101 \097\114\101 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115",function()local V=n.new({1})local F=n.new({1,2,3,4;5})V:RemoveAll(F);(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\109\111\118\105\110\103 \119\105\116\104 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115",function()local V=n.new({1})local F=n.new({1;2;3;4;5});(expect(V:RemoveAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\109\111\118\101 \111\110\101 \101\108\101\109\101\110\116 \102\114\111\109 \109\097\110\121",function()local V=n.new({1,2;3;4;5})local F=n.new({1})V:RemoveAll(F);(expect(V:Count())).to.equal(4)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\109\111\118\105\110\103 \111\110\101 \101\108\101\109\101\110\116 \102\114\111\109 \109\097\110\121",function()local V=n.new({1,2,3;4,5})local F=n.new({1});(expect(V:RemoveAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \110\111\116 \114\101\109\111\118\101 \119\104\101\110 \116\104\101 \101\108\101\109\101\110\116 \100\111\101\115 \110\111\116 \101\120\105\115\116",function()local V=n.new({1,2;3,4,5})local F=n.new({0})V:RemoveAll(F);(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \097\110 \101\108\101\109\101\110\116 \105\115\110\'\116 \114\101\109\111\118\101\100",function()local V=n.new({1,2,3,4;5})local F=n.new({0});(expect(V:RemoveAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\109\111\118\101 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2;3;4,5})local F=n.new({1,2,3;4,5})V:RemoveAll(F);(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\109\111\118\105\110\103 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2,3,4;5})local F=n.new({1;2,3;4;5});(expect(V:RemoveAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\109\111\118\101 \111\110\108\121 \111\110\099\101 \102\111\114 \101\097\099\104 \111\099\099\117\114\114\101\110\099\101 \111\102 \100\117\112\108\105\099\097\116\101 \101\108\101\109\101\110\116\115",function()local V=n.new({1,1;1;1,1})local F=n.new({1,1,1})V:RemoveAll(F);(expect(V:Count())).to.equal(2)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\109\111\118\105\110\103 \100\117\112\108\105\099\097\116\101\115",function()local V=n.new({1;1;1;1;1})local F=n.new({1;1;1});(expect(V:RemoveAll(F))).to.equal(true)end)end)describe("\082\101\116\097\105\110\065\108\108",function()it("\115\104\111\117\108\100 \115\117\099\099\101\115\115\102\117\108\108\121 \097\116\116\101\109\112\116 \116\111 \114\101\116\097\105\110 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1;2,3,4,5});(expect(function()V:RetainAll(F)end)).never.to.throw()end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \119\104\101\110 \101\109\112\116\121",function()local V=n.new()local F=n.new({1;2,3,4;5});(expect(V:RetainAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1})local F=n.new({1})V:RetainAll(F);(expect(V:Count())).to.equal(1)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1})local F=n.new({1});(expect(V:RetainAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \119\105\116\104 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115 \116\111 \114\101\116\097\105\110",function()local V=n.new({1})local F=n.new({1,2,3;4;5})V:RetainAll(F);(expect(V:Count())).to.equal(1)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \119\105\116\104 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115 \116\111 \114\101\116\097\105\110",function()local V=n.new({1})local F=n.new({1;2;3,4;5});(expect(V:RetainAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \110\111\116 \114\101\116\097\105\110 \111\110\101 \101\108\101\109\101\110\116 \119\104\105\099\104 \100\111\101\115 \110\111\116 \109\097\116\099\104",function()local V=n.new({1})local F=n.new({0})V:RetainAll(F);(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \110\111\116 \114\101\116\097\105\110\105\110\103 \111\110\101 \101\108\101\109\101\110\116 \116\104\097\116 \100\111\101\115 \110\111\116 \109\097\116\099\104",function()local V=n.new({1})local F=n.new({0});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \111\110\101 \101\108\101\109\101\110\116 \102\114\111\109 \109\097\110\121",function()local V=n.new({1,2,3;4;5})local F=n.new({3})V:RetainAll(F);(expect(V:Count())).to.equal(1)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \111\110\101 \101\108\101\109\101\110\116 \102\114\111\109 \109\097\110\121",function()local V=n.new({1,2;3,4,5})local F=n.new({3});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \110\111 \101\108\101\109\101\110\116\115 \119\104\101\110 \111\110\101 \101\108\101\109\101\110\116 \100\111\101\115 \110\111\116 \109\097\116\099\104",function()local V=n.new({1,2,3;4;5})local F=n.new({6})V:RetainAll(F);(expect(V:Count())).to.equal(0)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \110\111\116 \114\101\116\097\105\110\105\110\103 \111\110\101 \101\108\101\109\101\110\116",function()local V=n.new({1;2,3,4;5})local F=n.new({3});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \109\111\114\101 \101\120\105\115\116",function()local V=n.new({1;2,3;4,5})local F=n.new({1,3,5})V:RetainAll(F);(expect(V:Count())).to.equal(3)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \109\111\114\101 \101\120\105\115\116",function()local V=n.new({1,2;3;4;5})local F=n.new({1,3;5});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \109\117\108\116\105\112\108\101 \101\108\101\109\101\110\116\115 \119\104\101\110 \097\116\116\101\109\112\116\105\110\103 \116\111 \114\101\116\097\105\110 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2;3;4;5})local F=n.new({0,1,3})V:RetainAll(F);(expect(V:Count())).to.equal(2)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \097\116\116\101\109\112\105\110\103 \116\111 \114\101\116\097\105\110 \119\105\116\104 \101\120\099\101\115\115 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2,3,4,5})local F=n.new({0,1,3});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \097\108\108 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2,3;4;5})local F=n.new({1,2;3;4,5})V:RetainAll(F);(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \097\108\108 \101\108\101\109\101\110\116\115",function()local V=n.new({1;2,3;4,5})local F=n.new({1,2,3;4,5});(expect(V:RetainAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \097\108\108 \101\108\101\109\101\110\116\115 \119\104\101\110 \097\116\116\101\109\112\116\105\110\103 \116\111 \114\101\116\097\105\110 \101\120\099\101\115\115",function()local V=n.new({1,2;3;4,5})local F=n.new({0,1,2;3,4;5})V:RetainAll(F);(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \097\116\116\101\109\112\116\105\110\103 \116\111 \114\101\116\097\105\110 \101\120\099\101\101\115\115 \097\110\100 \114\101\116\097\105\110\105\110\103 \097\108\108 \101\108\101\109\101\110\116\115",function()local V=n.new({1,2;3;4;5})local F=n.new({0,1,2,3,4,5});(expect(V:RetainAll(F))).to.equal(false)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \097\108\108 \100\117\112\108\105\099\097\116\101\115",function()local V=n.new({1,1;2,2;3})local F=n.new({1,2})V:RetainAll(F);(expect(V:Count())).to.equal(4)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \116\114\117\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \100\117\112\108\105\099\097\116\101\115 \097\110\100 \109\111\114\101 \101\120\105\115\116",function()local V=n.new({1;1,2;2,3})local F=n.new({1;2});(expect(V:RetainAll(F))).to.equal(true)end)it("\115\104\111\117\108\100 \114\101\116\097\105\110 \097\108\108 \100\117\112\108\105\099\097\116\101\115 \119\104\101\110 \097\116\116\101\109\112\105\110\103 \116\111 \114\101\116\097\105\110 \101\120\099\101\115\115",function()local V=n.new({1;1,1;1,1})local F=n.new({1;2})V:RetainAll(F);(expect(V:Count())).to.equal(5)end)it("\115\104\111\117\108\100 \114\101\116\117\114\110 \102\097\108\115\101 \119\104\101\110 \114\101\116\097\105\110\105\110\103 \097\108\108 \100\117\112\108\105\099\097\116\101\115",function()local V=n.new({1;1;1,1,1})local F=n.new({1});(expect(V:RetainAll(F))).to.equal(false)end)end)end)end)describe("\076\105\115\116 \073\110\116\101\114\102\097\099\101",function()describe("\082\101\113\117\105\114\101\100 \077\101\116\104\111\100\115",function()describe("\070\105\114\115\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \070\105\114\115\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.First()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \070\105\114\115\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\071\101\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \071\101\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Get()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \071\101\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\073\110\100\101\120\079\102",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \073\110\100\101\120\079\102 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.IndexOf()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \073\110\100\101\120\079\102 \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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\076\097\115\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \076\097\115\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Last()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \076\097\115\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\076\097\115\116\073\110\100\101\120\079\102",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \076\097\115\116\073\110\100\101\120\079\102 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.LastIndexOf()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \076\097\115\116\073\110\100\101\120\079\102 \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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\083\117\098",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \083\117\098 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Sub()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \083\117\098 \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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)end)describe("\079\112\116\105\111\110\097\108 \077\101\116\104\111\100\115",function()describe("\068\101\108\101\116\101",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \068\101\108\101\116\101 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Delete()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \068\101\108\101\116\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\073\110\115\101\114\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \073\110\115\101\114\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Insert()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \073\110\115\101\114\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\073\110\115\101\114\116\065\108\108",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \073\110\115\101\114\116\065\108\108 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.InsertAll()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \073\110\115\101\114\116\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\080\111\112",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \080\111\112 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Pop()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \080\111\112 \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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\080\117\115\104",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \080\117\115\104 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Push()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \080\117\115\104 \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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\083\101\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \083\101\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Set()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \083\101\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\083\104\105\102\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \083\104\105\102\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Shift()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \083\104\105\102\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)describe("\085\110\115\104\105\102\116",function()it("\115\104\111\117\108\100 \101\114\114\111\114 \119\104\101\110 \085\110\115\104\105\102\116 \105\115 \110\111\116 \111\118\101\114\114\105\100\100\101\110",function()local V=F.new();(expect(function()V.Unshift()end)).to.throw("\065\098\115\116\114\097\099\116 \109\101\116\104\111\100 \085\110\115\104\105\102\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 \065\098\115\116\114\097\099\116\076\105\115\116\046")end)end)end)end)end
--- Tests for the @{AbstractList} abstract class.

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

	local SomeList = AbstractList.new()
	SomeList.__index = SomeList

	function SomeList.new(collection)
		local self = setmetatable({}, SomeList)
		self.array = {}
		if collection ~= nil then
			local typeCollection = type(collection)
			if typeCollection == "table" then
				if type(collection.Enumerator) == "function" then
					-- If there's an Enumerator, assume it acts as a collection
					for _, value in collection:Enumerator() do
						self.array[#self.array + 1] = value
					end
				else -- Otherwise its just a table (we can't know otherwise)
					for _, value in ipairs(collection) do
						self.array[#self.array + 1] = value
					end
				end
			else
				error(string.format("Cannot construct SomeList from type %s.", typeCollection))
			end
		end
		return self
	end

	SomeList.Enumerator = ArrayList.Enumerator
	SomeList.Add = ArrayList.Add
	SomeList.Remove = ArrayList.Remove
	SomeList.First = ArrayList.First
	SomeList.Get = ArrayList.Get
	SomeList.IndexOf = ArrayList.IndexOf
	SomeList.Last = ArrayList.Last
	SomeList.LastIndexOf = ArrayList.LastIndexOf
	SomeList.Sub = ArrayList.Sub
	SomeList.Delete = ArrayList.Delete
	SomeList.Insert = ArrayList.Insert
	SomeList.InsertAll = ArrayList.InsertAll
	SomeList.Pop = ArrayList.Pop
	SomeList.Push = ArrayList.Push
	SomeList.Set = ArrayList.Set
	SomeList.Shift = ArrayList.Shift
	SomeList.Unshift = ArrayList.Unshift

	describe("Constructor", function()
		it("should create an empty AbstractList", function()
			local list = AbstractList.new()
			expect(list).to.be.ok()
		end)
	end)

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

	describe("Collection Interface", function()
		describe("Required Methods", function()
			describe("Contains", function()
				it("should not find any element when empty", function()
					local list = SomeList.new()
					expect(list:Contains(0)).to.equal(false)
				end)

				it("should find an element when that element exists", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Contains(1)).to.equal(true)
				end)

				it("should not find an element when that element does not exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Contains(0)).to.equal(false)
				end)

				it("should not find an element until it is added", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Contains(0)).to.equal(false)
					list:Add(0)
					expect(list:Contains(0)).to.equal(true)
				end)

				it("should no longer find an element when its removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Contains(1)).to.equal(true)
					list:Remove(1)
					expect(list:Contains(1)).to.equal(false)
				end)
			end)

			describe("ContainsAll", function()
				it("should not find any element when empty", function()
					local list = SomeList.new()
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAll(contained)).to.equal(false)
				end)

				it("should find all zero elements when the provided Collection is empty", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new()
					expect(list:ContainsAll(contained)).to.equal(true)
				end)

				it("should find all elements when all of the elements exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAll(contained)).to.equal(true)
				end)

				it("should find one element when it exists", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 3 })
					expect(list:ContainsAll(contained)).to.equal(true)
				end)

				it("should not find all elements when one does not exist", function()
					local list = SomeList.new({ 1, 2, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAll(contained)).to.equal(false)
				end)

				it("should not find one element when it does not exist", function()
					local list = SomeList.new({ 1, 2, 4, 5 })
					local contained = SomeList.new({ 3 })
					expect(list:ContainsAll(contained)).to.equal(false)
				end)

				it("should not find elements until they are added", function()
					local list = SomeList.new()
					local contained = SomeList.new({ 1, 2 })
					expect(list:ContainsAll(contained)).to.equal(false)
					list:Add(1)
					expect(list:ContainsAll(contained)).to.equal(false)
					list:Add(2)
					expect(list:ContainsAll(contained)).to.equal(true)
				end)

				it("should no longer find all elements when they are removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAll(contained)).to.equal(true)
					list:Remove(1)
					expect(list:ContainsAll(contained)).to.equal(false)
				end)
			end)

			describe("ContainsAny", function()
				it("should not find any element when empty", function()
					local list = SomeList.new()
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAny(contained)).to.equal(false)
				end)

				it("should not find any element when the provided Collection is empty", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new()
					expect(list:ContainsAny(contained)).to.equal(false)
				end)

				it("should find all elements when the elements exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAny(contained)).to.equal(true)
				end)

				it("should find one element when it exists", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 3 })
					expect(list:ContainsAny(contained)).to.equal(true)
				end)

				it("should not find some elements when only one does not exist", function()
					local list = SomeList.new({ 1, 2, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAny(contained)).to.equal(true)
				end)

				it("should not find one element when it does not exist", function()
					local list = SomeList.new({ 1, 2, 4, 5 })
					local contained = SomeList.new({ 3 })
					expect(list:ContainsAny(contained)).to.equal(false)
				end)

				it("should not find elements until they are added", function()
					local list = SomeList.new()
					local contained = SomeList.new({ 1, 2 })
					expect(list:ContainsAny(contained)).to.equal(false)
					list:Add(1)
					expect(list:ContainsAny(contained)).to.equal(true)
				end)

				it("should no longer find all elements when they are all removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local contained = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:ContainsAny(contained)).to.equal(true)
					list:Remove(1)
					expect(list:ContainsAny(contained)).to.equal(true)
					list:Clear()
					expect(list:ContainsAny(contained)).to.equal(false)
				end)
			end)

			describe("Count", function()
				it("should count zero when empty", function()
					local list = SomeList.new()
					expect(list:Count()).to.equal(0)
				end)

				it("should count the number of elements in the AbstractList", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Count()).to.equal(5)
				end)

				it("should count new elements when they are added", function()
					local list = SomeList.new()
					local total = 10
					expect(list:Count()).to.equal(0)
					for i = 1, total do
						list:Add(i)
						expect(list:Count()).to.equal(i)
					end
					expect(list:Count()).to.equal(total)
				end)

				it("should not count elements after they are removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local count = list:Count()
					expect(count).to.equal(5)
					while count > 0 do
						list:Pop()
						local oldCount = count
						count = list:Count()
						expect(count).to.equal(oldCount - 1)
					end
				end)

				it("should count zero after being cleared", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Count()).to.equal(5)
					list:Clear()
					expect(list:Count()).to.equal(0)
				end)
			end)

			describe("Empty", function()
				it("should be empty when instantiated", function()
					local list = SomeList.new()
					expect(list:Empty()).to.equal(true)
				end)

				it("should not be empty with one element", function()
					local list = SomeList.new({ 1 })
					expect(list:Empty()).to.equal(false)
				end)

				it("should not be empty with multiple elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Empty()).to.equal(false)
				end)

				it("should no longer be empty after an element is added", function()
					local list = SomeList.new()
					expect(list:Empty()).to.equal(true)
					list:Add(1)
					expect(list:Empty()).to.equal(false)
				end)

				it("should be empty after all elements are removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local count = list:Count()
					while count > 0 do
						expect(list:Empty()).to.equal(false)
						list:Pop()
						count = list:Count()
					end
					expect(list:Empty()).to.equal(true)
				end)

				it("should be empty after being cleared", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Empty()).to.equal(false)
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)
			end)

			describe("ToArray", function()
				it("should return a table", function()
					local list = SomeList.new()
					expect(list:ToArray()).to.be.a("table")
				end)

				it("should create a table of the same size", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(#list:ToArray()).to.equal(list:Count())
				end)

				it("should create an empty table when empty", function()
					local list = SomeList.new()
					expect(#list:ToArray()).to.equal(0)
				end)

				it("should create a table with the same elements and order of enumeration", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local array = list:ToArray()
					expect(#array).to.equal(list:Count())
					for i, v in ipairs(array) do
						expect(v).to.equal(list:Get(i))
					end
				end)

				it("should provide only array indexable elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local array = list:ToArray()
					local count = 0
					for _ in pairs(array) do
						count = count + 1
					end
					expect(count).to.equal(#array)
				end)
			end)

			describe("ToTable", function()
				it("should provide the same representation as ToArray", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local array = list:ToArray()
					local table = list:ToTable()
					expect(table).to.be.a("table")
					expect(#table).to.equal(#array)
					for i, v in pairs(table) do
						expect(v).to.equal(array[i])
					end
				end)
			end)
		end)

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

			describe("AddAll", function()
				it("should add multiple elements when empty", function()
					local list = SomeList.new()
					local add = SomeList.new({ 1, 2, 3, 4, 5 })
					list:AddAll(add)
					expect(list:Count()).to.equal(5)
				end)

				it("should add one element when empty", function()
					local list = SomeList.new()
					local add = SomeList.new({ 1 })
					list:AddAll(add)
					expect(list:Count()).to.equal(1)
				end)

				it("should add multiple elements when not empty", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local add = SomeList.new({ 6, 7, 8, 9, 0 })
					list:AddAll(add)
					expect(list:Count()).to.equal(10)
				end)

				it("should add one element when not empty", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local add = SomeList.new({ 6 })
					list:AddAll(add)
					expect(list:Count()).to.equal(6)
				end)

				it("should add multiple elements to the end", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local add = SomeList.new({ 6, 7, 8, 9, 10 })
					list:AddAll(add)
					expect(list:Get(6)).to.equal(6)
					expect(list:Get(7)).to.equal(7)
					expect(list:Get(8)).to.equal(8)
					expect(list:Get(9)).to.equal(9)
					expect(list:Get(10)).to.equal(10)
				end)

				it("should add one element to the end", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local add = SomeList.new({ 6 })
					list:AddAll(add)
					expect(list:Get(6)).to.equal(6)
				end)

				it("should return true when adding multiple elements", function()
					local list = SomeList.new()
					local add = SomeList.new({ 6, 7, 8, 9, 10 })
					expect(list:AddAll(add)).to.equal(true)
				end)

				it("should return true when adding one element", function()
					local list = SomeList.new()
					local add = SomeList.new({ 6 })
					expect(list:AddAll(add)).to.equal(true)
				end)

				it("should add multiple duplicate elements", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local add = SomeList.new({ 1, 1, 1, 1, 1 })
					list:AddAll(add)
					expect(list:Count()).to.equal(10)
				end)

				it("should add one duplicate element", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local add = SomeList.new({ 1 })
					list:AddAll(add)
					expect(list:Count()).to.equal(6)
				end)
			end)

			describe("Clear", function()
				it("should clear all elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:Empty()).to.equal(false)
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)

				it("should clear when already empty", function()
					local list = SomeList.new()
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)

				it("should clear with one element", function()
					local list = SomeList.new({ 1 })
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)

				it("should clear with multiple elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)

				it("should clear with duplicate elements", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					list:Clear()
					expect(list:Empty()).to.equal(true)
				end)
			end)

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

			describe("RemoveAll", function()
				it("should successfully attempt to remove when empty", function()
					local list = SomeList.new()
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(function()
						list:RemoveAll(remove)
					end).never.to.throw()
				end)

				it("should return false when attempting to remove when empty", function()
					local list = SomeList.new()
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RemoveAll(remove)).to.equal(false)
				end)

				it("should remove one element", function()
					local list = SomeList.new({ 1 })
					local remove = SomeList.new({ 1 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(0)
				end)

				it("should return true when removing one element", function()
					local list = SomeList.new({ 1 })
					local remove = SomeList.new({ 1 })
					expect(list:RemoveAll(remove)).to.equal(true)
				end)

				it("should remove when there are excess elements", function()
					local list = SomeList.new({ 1 })
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(0)
				end)

				it("should return true when removing with excess elements", function()
					local list = SomeList.new({ 1 })
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RemoveAll(remove)).to.equal(true)
				end)

				it("should remove one element from many", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 1 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(4)
				end)

				it("should return true when removing one element from many", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 1 })
					expect(list:RemoveAll(remove)).to.equal(true)
				end)

				it("should not remove when the element does not exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 0 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(5)
				end)

				it("should return false when an element isn't removed", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 0 })
					expect(list:RemoveAll(remove)).to.equal(false)
				end)

				it("should remove multiple elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(0)
				end)

				it("should return true when removing multiple elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local remove = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RemoveAll(remove)).to.equal(true)
				end)

				it("should remove only once for each occurrence of duplicate elements", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local remove = SomeList.new({ 1, 1, 1 })
					list:RemoveAll(remove)
					expect(list:Count()).to.equal(2)
				end)

				it("should return true when removing duplicates", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local remove = SomeList.new({ 1, 1, 1 })
					expect(list:RemoveAll(remove)).to.equal(true)
				end)
			end)

			describe("RetainAll", function()
				it("should successfully attempt to retain when empty", function()
					local list = SomeList.new()
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(function()
						list:RetainAll(retain)
					end).never.to.throw()
				end)

				it("should return false when retaining when empty", function()
					local list = SomeList.new()
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)

				it("should retain one element", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 1 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(1)
				end)

				it("should return false when retaining one element", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 1 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)

				it("should retain with excess elements to retain", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(1)
				end)

				it("should return false when retaining with excess elements to retain", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)

				it("should not retain one element which does not match", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 0 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(0)
				end)

				it("should return true when not retaining one element that does not match", function()
					local list = SomeList.new({ 1 })
					local retain = SomeList.new({ 0 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain one element from many", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 3 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(1)
				end)

				it("should return true when retaining one element from many", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 3 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain no elements when one element does not match", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 6 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(0)
				end)

				it("should return true when not retaining one element", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 3 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain multiple elements when more exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 1, 3, 5 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(3)
				end)

				it("should return true when retaining multiple elements when more exist", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 1, 3, 5 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain multiple elements when attempting to retain excess elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 0, 1, 3 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(2)
				end)

				it("should return true when attemping to retain with excess elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 0, 1, 3 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain all elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(5)
				end)

				it("should return false when retaining all elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 1, 2, 3, 4, 5 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)

				it("should retain all elements when attempting to retain excess", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 0, 1, 2, 3, 4, 5 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(5)
				end)

				it("should return false when attempting to retain exceess and retaining all elements", function()
					local list = SomeList.new({ 1, 2, 3, 4, 5 })
					local retain = SomeList.new({ 0, 1, 2, 3, 4, 5 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)

				it("should retain all duplicates", function()
					local list = SomeList.new({ 1, 1, 2, 2, 3 })
					local retain = SomeList.new({ 1, 2 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(4)
				end)

				it("should return true when retaining duplicates and more exist", function()
					local list = SomeList.new({ 1, 1, 2, 2, 3 })
					local retain = SomeList.new({ 1, 2 })
					expect(list:RetainAll(retain)).to.equal(true)
				end)

				it("should retain all duplicates when attemping to retain excess", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local retain = SomeList.new({ 1, 2 })
					list:RetainAll(retain)
					expect(list:Count()).to.equal(5)
				end)

				it("should return false when retaining all duplicates", function()
					local list = SomeList.new({ 1, 1, 1, 1, 1 })
					local retain = SomeList.new({ 1 })
					expect(list:RetainAll(retain)).to.equal(false)
				end)
			end)
		end)
	end)

	describe("List Interface", function()
		describe("Required Methods", function()
			describe("First", function()
				it("should error when First is not overridden", function()
					local list = AbstractList.new()
					expect(function()
						list.First()
					end).to.throw(
						"Abstract method First must be overridden in first concrete subclass. Called directly from AbstractList."
					)
				end)
			end)

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

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

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

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

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

		describe("Optional Methods", function()
			describe("Delete", function()
				it("should error when Delete is not overridden", function()
					local list = AbstractList.new()
					expect(function()
						list.Delete()
					end).to.throw(
						"Abstract method Delete must be overridden in first concrete subclass. Called directly from AbstractList."
					)
				end)
			end)

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

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

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

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

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

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

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