package Ġit . uni bo . tup ro log . solve . primitive Ċ Ċ import Ġit . uni bo . tup ro log . core .* Ċ import Ġit . uni bo . tup ro log . solve . Signature Ċ import Ġit . uni bo . tup ro log . solve . extract Signature Ċ import Ġkotlin . test .* Ċ Ċ /** Ċ Ġ* ĠTest Ġclass Ġfor Ġ[ Signature ] Ċ Ġ* Ċ Ġ* Ġ@ author ĠEn ric o Ċ Ġ*/ Ċ internal Ġclass ĠSignature Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsignature Name Ġ= Ġ" my Func " ĊĠĠĠ Ġprivate Ġval Ġsignature Ar ity Ġ= Ġ 3 ĊĊĠĠĠ Ġprivate Ġval Ġa Atom Ġ= ĠAtom . of (" a ") ĊĠĠĠ Ġprivate Ġval Ġarg List Ġ= ĠlistOf ( a Atom , Ġa Atom , Ġa Atom ) ĊĊĠĠĠ Ġprivate Ġval Ġnormal Signature Ġ= ĠSignature ( signature Name , Ġsignature Ar ity ) ĊĠĠĠ Ġprivate Ġval Ġvar arg Signature Ġ= ĊĠĠĠĠĠĠĠ ĠSignature ( signature Name , Ġsignature Ar ity , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġval Ġnormal Signature Term Ġ= ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠInteger . of ( signature Ar ity )) ĊĠĠĠ Ġprivate Ġval Ġvar arg Signature Term Ġ= ĊĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠStruct . of ("+ ", ĠInteger . of ( signature Ar ity ), ĠAtom . of (" var arg "))) ĊĊĠĠĠ Ġprivate Ġval Ġsignatures Ġ= ĠlistOf ( normal Signature , Ġvar arg Signature ) ĊĠĠĠ Ġprivate Ġval Ġsignature Terms Ġ= ĠlistOf ( normal Signature Term , Ġvar arg Signature Term ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġname Correct () Ġ{ ĊĠĠĠĠĠĠĠ Ġsignatures . forEach Ġ{ ĠassertEquals ( signature Name , Ġit . name ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġar ity Correct () Ġ{ ĊĠĠĠĠĠĠĠ Ġsignatures . forEach Ġ{ ĠassertEquals ( signature Ar ity , Ġit . arity ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvar arg Correct () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertFalse Ġ{ Ġnormal Signature . var arg Ġ} ĊĠĠĠĠĠĠĠ ĠassertTrue Ġ{ Ġvar arg Signature . var arg Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsignature With Negative Ar ity Is Pro hibited () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < IllegalArgumentException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġto Term Works As Expected () Ġ{ ĊĠĠĠĠĠĠĠ Ġsignature Terms . zip ( signatures . map Ġ{ Ġit . to Term () Ġ}). forEach Ġ{ Ġ( expected , Ġactual ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġactual ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Args Works On Non Var arg Signatures () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( normal Signature . with Args ( arg List ), ĠStruct . of ( signature Name , Ġarg List )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Args Works Even On Var arg Signatures () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( var arg Signature . with Args ( arg List ), ĠStruct . of ( signature Name , Ġarg List )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Args Comp l ains IfNot Correct NumberOf Arguments Provided () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < IllegalArgumentException > Ġ{ Ġnormal Signature . with Args ( emptyList ()) Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails With < IllegalArgumentException > Ġ{ Ġnormal Signature . with Args ( arg List Ġ+ Ġa Atom ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwith Args Comp l ains IfNot En ough Arguments For Var arg Signature Provided () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Fails With < IllegalArgumentException > Ġ{ Ġvar arg Signature . with Args ( emptyList ()) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( var arg Signature . with Args ( arg List Ġ+ Ġa Atom ), ĠStruct . of ( signature Name , Ġarg List Ġ+ Ġa Atom )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Term With Struct Creates Correct Instance () Ġ{ ĊĠĠĠĠĠĠĠ Ġsignatures . forEach Ġ{ ĠassertEquals ( it , ĠSignature . from Signature Term ( it . to Term ()) Ġ?: Ġfail ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignature Terms . zip ( signatures ). forEach Ġ{ Ġ( signature Term , Ġsignature ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( signature , ĠSignature . from Signature Term ( signature Term ) Ġ?: Ġfail ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Term With Struct Returns Null If Something Not Matching Correct Pattern () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Signature Term ( Struct . of ("\\ ", ĠAtom . of ( signature Name ), ĠInteger . of ( signature Ar ity )))) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠInteger . of ( signature Ar ity ), ĠTr uth . TRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Signature Term ( Struct . of ("/", ĠVar . anonymous (), ĠInteger . of ( signature Ar ity )))) ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Signature Term ( Struct . of ("/", ĠAtom . of ( signature Name ), ĠVar . anonymous ()))) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠStruct . of (" a ", ĠInteger . of ( signature Ar ity ), ĠAtom . of (" var arg "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom . of ( signature Name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("+ ", ĠInteger . of ( signature Ar ity ), ĠAtom . of (" var arg "), ĠTr uth . TRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠStruct . of ("+ ", ĠVar . anonymous (), ĠAtom . of (" var arg "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠStruct . of ("+ ", ĠInteger . of ( signature Ar ity ), ĠVar . anonymous ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSignature . from Signature Term ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStruct . of ("/", ĠAtom . of ( signature Name ), ĠStruct . of ("+ ", ĠInteger . of (- 1 ), ĠAtom . of (" var arg "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Term With Term Creates Correct Instance () Ġ{ ĊĠĠĠĠĠĠĠ Ġsignatures . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( it , ĠSignature . from Signature Term ( it . to Term () Ġas ĠTerm ) Ġ?: Ġfail ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignature Terms . zip ( signatures ). forEach Ġ{ Ġ( signature Term , Ġsignature ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( signature , ĠSignature . from Signature Term ( signature Term Ġas ĠTerm ) Ġ?: Ġfail ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Term With Term Returns Null IfNot AS tr uct () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Signature Term ( Var . anonymous ())) ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Signature Term ( Numeric . of ( 2 ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Indicator Returns Correct Instance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġto Be Tested Ġ= ĠSignature . from Indicator ( Indicator . of ( signature Name , Ġsignature Ar ity )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( normal Signature , Ġto Be Tested ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfrom Indicator Returns Null IfNot Well For med () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( Signature . from Indicator ( Indicator . of ( Var . anonymous (), ĠVar . anonymous ()))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġto Indicator Works On Non Var arg Signatures () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( Indicator . of ( signature Name , Ġsignature Ar ity ), Ġnormal Signature . to Indicator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġto Indicator Comp l ains On Var arg Signatures () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNull ( var arg Signature . to Indicator ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstruct Extract Signature Works As Expected () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( Signature ( a Atom . value , Ġa Atom . arity ), Ġa Atom . extract Signature ()) ĊĠĠĠĠĠĠĠ Ġsignature Terms . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Signature ( it . functor , Ġit . arity ), Ġit . extract Signature ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ