@@ -635,6 +635,70 @@ TEST(IR_2020_12, anyof_three_branches) {
635635 " /anyOf/2" );
636636}
637637
638+ TEST (IR_2020_12, oneof_two_branches) {
639+ const sourcemeta::core::JSON schema{sourcemeta::core::parse_json (R"JSON( {
640+ "$schema": "https://json-schema.org/draft/2020-12/schema",
641+ "oneOf": [
642+ { "type": "string" },
643+ { "type": "integer" }
644+ ]
645+ })JSON" )};
646+
647+ const auto result{
648+ sourcemeta::codegen::compile (schema, sourcemeta::core::schema_walker,
649+ sourcemeta::core::schema_resolver,
650+ sourcemeta::codegen::default_compiler)};
651+
652+ using namespace sourcemeta ::codegen;
653+
654+ EXPECT_EQ (result.size (), 3 );
655+
656+ EXPECT_IR_SCALAR (result, 0 , Integer, " /oneOf/1" );
657+ EXPECT_IR_SCALAR (result, 1 , String, " /oneOf/0" );
658+
659+ EXPECT_TRUE (std::holds_alternative<IRUnion>(result.at (2 )));
660+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (2 )).pointer , " " );
661+ EXPECT_EQ (std::get<IRUnion>(result.at (2 )).values .size (), 2 );
662+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (2 )).values .at (0 ).pointer ,
663+ " /oneOf/0" );
664+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (2 )).values .at (1 ).pointer ,
665+ " /oneOf/1" );
666+ }
667+
668+ TEST (IR_2020_12, oneof_three_branches) {
669+ const sourcemeta::core::JSON schema{sourcemeta::core::parse_json (R"JSON( {
670+ "$schema": "https://json-schema.org/draft/2020-12/schema",
671+ "oneOf": [
672+ { "type": "string" },
673+ { "type": "integer" },
674+ { "type": "boolean" }
675+ ]
676+ })JSON" )};
677+
678+ const auto result{
679+ sourcemeta::codegen::compile (schema, sourcemeta::core::schema_walker,
680+ sourcemeta::core::schema_resolver,
681+ sourcemeta::codegen::default_compiler)};
682+
683+ using namespace sourcemeta ::codegen;
684+
685+ EXPECT_EQ (result.size (), 4 );
686+
687+ EXPECT_IR_SCALAR (result, 0 , Boolean, " /oneOf/2" );
688+ EXPECT_IR_SCALAR (result, 1 , Integer, " /oneOf/1" );
689+ EXPECT_IR_SCALAR (result, 2 , String, " /oneOf/0" );
690+
691+ EXPECT_TRUE (std::holds_alternative<IRUnion>(result.at (3 )));
692+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (3 )).pointer , " " );
693+ EXPECT_EQ (std::get<IRUnion>(result.at (3 )).values .size (), 3 );
694+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (3 )).values .at (0 ).pointer ,
695+ " /oneOf/0" );
696+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (3 )).values .at (1 ).pointer ,
697+ " /oneOf/1" );
698+ EXPECT_AS_STRING (std::get<IRUnion>(result.at (3 )).values .at (2 ).pointer ,
699+ " /oneOf/2" );
700+ }
701+
638702TEST (IR_2020_12, ref_recursive_to_root) {
639703 const sourcemeta::core::JSON schema{sourcemeta::core::parse_json (R"JSON( {
640704 "$schema": "https://json-schema.org/draft/2020-12/schema",
0 commit comments