@@ -374,7 +374,8 @@ struct EnumStruct
374374 {
375375 One,
376376 Two,
377- Three
377+ Three,
378+ Unconverted // Deliberately omitted from conversion
378379 };
379380
380381 SampleEnum se;
@@ -390,17 +391,81 @@ DECLARE_JSON_REQUIRED_FIELDS(EnumStruct, se);
390391
391392TEST_CASE (" enum" )
392393{
393- EnumStruct es;
394- es.se = EnumStruct::SampleEnum::Two;
394+ {
395+ INFO (" Schema generation" );
396+ EnumStruct es;
397+ es.se = EnumStruct::SampleEnum::Two;
398+
399+ nlohmann::json j = es;
400+
401+ REQUIRE (j[" se" ] == " two" );
402+
403+ const auto schema = ds::json::build_schema<EnumStruct>(" EnumStruct" );
404+
405+ const nlohmann::json expected{" one" , " two" , " three" };
406+ REQUIRE (schema[" properties" ][" se" ][" enum" ] == expected);
407+ }
408+
409+ {
410+ INFO (" from_json" );
411+
412+ nlohmann::json j;
413+
414+ // Test good conversions
415+ j = " one" ;
416+ REQUIRE (j.get <EnumStruct::SampleEnum>() == EnumStruct::SampleEnum::One);
417+
418+ j = " two" ;
419+ REQUIRE (j.get <EnumStruct::SampleEnum>() == EnumStruct::SampleEnum::Two);
420+
421+ j = " three" ;
422+ REQUIRE (j.get <EnumStruct::SampleEnum>() == EnumStruct::SampleEnum::Three);
423+
424+ // Any other value will throw
425+ j = " One" ;
426+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
395427
396- nlohmann::json j = es;
428+ j = " two " ;
429+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
397430
398- REQUIRE (j[" se" ] == " two" );
431+ j = " three" ;
432+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
399433
400- const auto schema = ds::json::build_schema<EnumStruct>(" EnumStruct" );
434+ j = " penguin" ;
435+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
401436
402- const nlohmann::json expected{" one" , " two" , " three" };
403- REQUIRE (schema[" properties" ][" se" ][" enum" ] == expected);
437+ j = 0 ;
438+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
439+
440+ j = 1 ;
441+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
442+
443+ j = nlohmann::json::object ();
444+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
445+
446+ j = nullptr ;
447+ REQUIRE_THROWS (j.get <EnumStruct::SampleEnum>());
448+ }
449+
450+ {
451+ INFO (" to_json" );
452+
453+ nlohmann::json j;
454+
455+ j = EnumStruct::SampleEnum::One;
456+ REQUIRE (j.is_string ());
457+ REQUIRE (j.get <std::string>() == " one" );
458+
459+ j = EnumStruct::SampleEnum::Two;
460+ REQUIRE (j.is_string ());
461+ REQUIRE (j.get <std::string>() == " two" );
462+
463+ j = EnumStruct::SampleEnum::Three;
464+ REQUIRE (j.is_string ());
465+ REQUIRE (j.get <std::string>() == " three" );
466+
467+ REQUIRE_THROWS (j = EnumStruct::SampleEnum::Unconverted);
468+ }
404469}
405470
406471namespace examples
0 commit comments