@@ -802,6 +802,166 @@ TEST_F(LLVMCodeBuilderTest, GreaterAndLowerThanComparison)
802802 addOpTest (nan, " 0" );
803803}
804804
805+ TEST_F (LLVMCodeBuilderTest, AndOr)
806+ {
807+ auto addOpTest = [this ](Value v1, Value v2) {
808+ // And
809+ createBuilder (true );
810+
811+ m_builder->addConstValue (v1);
812+ m_builder->addConstValue (v2);
813+ m_builder->createAnd ();
814+ m_builder->addFunctionCall (" test_print_string" , Compiler::StaticType::Void, { Compiler::StaticType::String });
815+
816+ m_builder->addConstValue (v1);
817+ callConstFuncForType (v1.type ());
818+ m_builder->addConstValue (v2);
819+ callConstFuncForType (v2.type ());
820+ m_builder->createAnd ();
821+ m_builder->addFunctionCall (" test_print_string" , Compiler::StaticType::Void, { Compiler::StaticType::String });
822+
823+ std::string str = Value (v1.toBool () && v2.toBool ()).toString () + ' \n ' ;
824+ std::string expected = str + str;
825+
826+ auto code = m_builder->finalize ();
827+ auto ctx = code->createExecutionContext (&m_target);
828+
829+ testing::internal::CaptureStdout ();
830+ code->run (ctx.get ());
831+ const std::string quotes1 = v1.isString () ? " \" " : " " ;
832+ const std::string quotes2 = v2.isString () ? " \" " : " " ;
833+ ASSERT_THAT (testing::internal::GetCapturedStdout (), Eq (expected)) << " AND: " << quotes1 << v1.toString () << quotes1 << " " << quotes2 << v2.toString () << quotes2;
834+
835+ // Or
836+ createBuilder (true );
837+
838+ m_builder->addConstValue (v1);
839+ m_builder->addConstValue (v2);
840+ m_builder->createOr ();
841+ m_builder->addFunctionCall (" test_print_string" , Compiler::StaticType::Void, { Compiler::StaticType::String });
842+
843+ m_builder->addConstValue (v1);
844+ callConstFuncForType (v1.type ());
845+ m_builder->addConstValue (v2);
846+ callConstFuncForType (v2.type ());
847+ m_builder->createOr ();
848+ m_builder->addFunctionCall (" test_print_string" , Compiler::StaticType::Void, { Compiler::StaticType::String });
849+
850+ str = Value (v1.toBool () || v2.toBool ()).toString () + ' \n ' ;
851+ expected = str + str;
852+
853+ code = m_builder->finalize ();
854+ ctx = code->createExecutionContext (&m_target);
855+
856+ testing::internal::CaptureStdout ();
857+ code->run (ctx.get ());
858+ ASSERT_THAT (testing::internal::GetCapturedStdout (), Eq (expected)) << " OR: " << quotes1 << v1.toString () << quotes1 << " " << quotes2 << v2.toString () << quotes2;
859+ };
860+
861+ addOpTest (10 , 8 );
862+ addOpTest (-4.25 , -4.25 );
863+ addOpTest (-4.25 , 5.312 );
864+
865+ addOpTest (true , true );
866+ addOpTest (true , false );
867+ addOpTest (false , true );
868+
869+ addOpTest (1 , true );
870+ addOpTest (1 , false );
871+
872+ addOpTest (" abc" , " def" );
873+ addOpTest (" true" , " true" );
874+ addOpTest (" true" , " false" );
875+ addOpTest (" false" , " true" );
876+ addOpTest (" false" , " false" );
877+
878+ addOpTest (5.25 , " 5.25" );
879+ addOpTest (" 5.25" , 5.25 );
880+ addOpTest (0 , " 1" );
881+ addOpTest (" 1" , 0 );
882+ addOpTest (0 , " test" );
883+ addOpTest (" test" , 0 );
884+
885+ static const double inf = std::numeric_limits<double >::infinity ();
886+ static const double nan = std::numeric_limits<double >::quiet_NaN ();
887+
888+ addOpTest (inf, inf);
889+ addOpTest (-inf, -inf);
890+ addOpTest (nan, nan);
891+ addOpTest (inf, -inf);
892+ addOpTest (-inf, inf);
893+ addOpTest (inf, nan);
894+ addOpTest (nan, inf);
895+ addOpTest (-inf, nan);
896+ addOpTest (nan, -inf);
897+
898+ addOpTest (true , " true" );
899+ addOpTest (" true" , true );
900+ addOpTest (false , " false" );
901+ addOpTest (" false" , false );
902+ addOpTest (false , " true" );
903+ addOpTest (" true" , false );
904+ addOpTest (true , " false" );
905+ addOpTest (" false" , true );
906+ addOpTest (true , " TRUE" );
907+ addOpTest (" TRUE" , true );
908+ addOpTest (false , " FALSE" );
909+ addOpTest (" FALSE" , false );
910+
911+ addOpTest (true , " 00001" );
912+ addOpTest (" 00001" , true );
913+ addOpTest (true , " 00000" );
914+ addOpTest (" 00000" , true );
915+ addOpTest (false , " 00000" );
916+ addOpTest (" 00000" , false );
917+
918+ addOpTest (" true" , 1 );
919+ addOpTest (1 , " true" );
920+ addOpTest (" true" , 0 );
921+ addOpTest (0 , " true" );
922+ addOpTest (" false" , 0 );
923+ addOpTest (0 , " false" );
924+ addOpTest (" false" , 1 );
925+ addOpTest (1 , " false" );
926+
927+ addOpTest (" true" , " TRUE" );
928+ addOpTest (" true" , " FALSE" );
929+ addOpTest (" false" , " FALSE" );
930+ addOpTest (" false" , " TRUE" );
931+
932+ addOpTest (true , inf);
933+ addOpTest (inf, true );
934+ addOpTest (true , -inf);
935+ addOpTest (-inf, true );
936+ addOpTest (true , nan);
937+ addOpTest (nan, true );
938+ addOpTest (false , inf);
939+ addOpTest (inf, false );
940+ addOpTest (false , -inf);
941+ addOpTest (-inf, false );
942+ addOpTest (false , nan);
943+ addOpTest (nan, false );
944+
945+ addOpTest (" Infinity" , inf);
946+ addOpTest (" Infinity" , -inf);
947+ addOpTest (" Infinity" , nan);
948+ addOpTest (" infinity" , inf);
949+ addOpTest (" infinity" , -inf);
950+ addOpTest (" infinity" , nan);
951+ addOpTest (" -Infinity" , inf);
952+ addOpTest (" -Infinity" , -inf);
953+ addOpTest (" -Infinity" , nan);
954+ addOpTest (" -infinity" , inf);
955+ addOpTest (" -infinity" , -inf);
956+ addOpTest (" -infinity" , nan);
957+ addOpTest (" NaN" , inf);
958+ addOpTest (" NaN" , -inf);
959+ addOpTest (" NaN" , nan);
960+ addOpTest (" nan" , inf);
961+ addOpTest (" nan" , -inf);
962+ addOpTest (" nan" , nan);
963+ }
964+
805965TEST_F (LLVMCodeBuilderTest, Yield)
806966{
807967 auto build = [this ]() {
0 commit comments