@@ -173,4 +173,41 @@ StatsModels.apply_schema(mt::MultiTerm, sch::StatsModels.Schema, Mod::Type) =
173173
174174 end
175175
176+ @testset " Tuple terms" begin
177+ using StatsModels: TermOrTerms, TupleTerm, Term
178+ a, b, c = Term .((:a , :b , :c ))
179+
180+ # TermOrTerms - one or more AbstractTerms (if more, a tuple)
181+ # empty tuples are never terms
182+ @test ! (() isa TermOrTerms)
183+ @test (a, ) isa TermOrTerms
184+ @test (a, b) isa TermOrTerms
185+ @test (a, b, a& b) isa TermOrTerms
186+ @test ! (((), a) isa TermOrTerms)
187+ # can't contain further tuples
188+ @test ! ((a, (a,), b) isa TermOrTerms)
189+
190+ # a tuple of AbstractTerms OR Tuples of one or more terms
191+ # empty tuples are never terms
192+ @test ! (() isa TupleTerm)
193+ @test (a, ) isa TupleTerm
194+ @test (a, b) isa TupleTerm
195+ @test (a, b, a& b) isa TupleTerm
196+ @test ! (((), a) isa TupleTerm)
197+ @test (((a,), a) isa TupleTerm)
198+
199+ # no methods for operators on term and empty tuple (=no type piracy)
200+ @test_throws MethodError a + ()
201+ @test_throws MethodError () + a
202+ @test_throws MethodError a & ()
203+ @test_throws MethodError () & a
204+ @test_throws MethodError a ~ ()
205+ @test_throws MethodError () ~ a
206+
207+ # show methods of empty tuples preserved
208+ @test " $(()) " == " ()"
209+ @test " $((a,b)) " == " a + b"
210+ @test " $((a, ())) " == " (a, ())"
211+ end
212+
176213end
0 commit comments