@@ -2585,7 +2585,7 @@ TEST_F(IdlParserTests, default_builtin_annotation)
2585
2585
std::vector<std::string> include_paths;
2586
2586
include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2587
2587
2588
- // Set default values for struct members using positional parameters
2588
+ // Set default values for struct members and check that they are correctly parsed
2589
2589
DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/default_annotation.idl" , " default_ann_valid_struct" ,
2590
2590
include_paths);
2591
2591
DynamicTypeMember::_ref_type member;
@@ -2596,6 +2596,223 @@ TEST_F(IdlParserTests, default_builtin_annotation)
2596
2596
EXPECT_EQ (builder->get_member (member, 1 ), RETCODE_OK);
2597
2597
EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2598
2598
EXPECT_EQ (member_descriptor->default_value (), " foo" );
2599
+
2600
+ // Set default values for union members and check that they are correctly parsed
2601
+ builder = factory->create_type_w_uri (" IDL/default_annotation.idl" , " default_ann_valid_union" ,
2602
+ include_paths);
2603
+ ASSERT_TRUE (builder);
2604
+ EXPECT_EQ (builder->get_member_by_name (member, " first" ), RETCODE_OK);
2605
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2606
+ EXPECT_EQ (member_descriptor->default_value (), " 1" );
2607
+ EXPECT_EQ (builder->get_member_by_name (member, " second" ), RETCODE_OK);
2608
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2609
+ EXPECT_EQ (member_descriptor->default_value (), " foo" );
2610
+ EXPECT_EQ (builder->get_member_by_name (member, " third" ), RETCODE_OK);
2611
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2612
+ EXPECT_EQ (member_descriptor->default_value (), " 3.14" );
2613
+
2614
+ // Negative case: Trying to annotate using @default with invalid value type
2615
+ builder = factory->create_type_w_uri (" IDL/default_annotation.idl" , " default_ann_invalid_value_type" ,
2616
+ include_paths);
2617
+ ASSERT_FALSE (builder);
2618
+
2619
+ // Negative case: Trying to annotate using @default with additional parameters
2620
+ builder = factory->create_type_w_uri (" IDL/default_annotation.idl" , " default_ann_extra_parameter" ,
2621
+ include_paths);
2622
+ ASSERT_FALSE (builder);
2623
+
2624
+ // Negative case: Trying to annotate a constructed type with @default
2625
+ builder = factory->create_type_w_uri (" IDL/default_annotation.idl" , " default_ann_on_struct" ,
2626
+ include_paths);
2627
+ ASSERT_FALSE (builder);
2628
+ }
2629
+
2630
+ TEST_F (IdlParserTests, bit_bound_builtin_annotation)
2631
+ {
2632
+ DynamicTypeBuilderFactory::_ref_type factory {DynamicTypeBuilderFactory::get_instance ()};
2633
+ MemberDescriptor::_ref_type member_descriptor{traits<MemberDescriptor>::make_shared ()};
2634
+ std::vector<std::string> include_paths;
2635
+
2636
+ include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2637
+
2638
+ // TODO: Add positive tests for bitset/bitmask when bitset/bitmask parsing is supported.
2639
+
2640
+ // Set bit_bound annotation on enum members and check that they are correctly parsed
2641
+ DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/bit_bound_annotation.idl" , " bit_bound_ann_valid_enum" ,
2642
+ include_paths);
2643
+ DynamicTypeMember::_ref_type member;
2644
+ ASSERT_TRUE (builder);
2645
+ EXPECT_EQ (builder->get_member_by_name (member, " ENUM_VALUE_1" ), RETCODE_OK);
2646
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2647
+ EXPECT_EQ (member_descriptor->type (), factory->get_primitive_type (TK_INT8));
2648
+ EXPECT_EQ (builder->get_member_by_name (member, " ENUM_VALUE_2" ), RETCODE_OK);
2649
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2650
+ EXPECT_EQ (member_descriptor->type (), factory->get_primitive_type (TK_INT8));
2651
+
2652
+ // Negative case: Trying to annotate using @bit_bound with invalid bound value
2653
+ builder = factory->create_type_w_uri (" IDL/bit_bound_annotation.idl" , " bit_bound_ann_invalid_bound_value_enum" ,
2654
+ include_paths);
2655
+ // ASSERT_FALSE(builder);
2656
+ EXPECT_FALSE (builder);
2657
+
2658
+ // Negative case: Trying to annotate using @bit_bound with invalid value type
2659
+ builder = factory->create_type_w_uri (" IDL/bit_bound_annotation.idl" , " bit_bound_ann_invalid_value_type_enum" ,
2660
+ include_paths);
2661
+ ASSERT_FALSE (builder);
2662
+
2663
+ // Negative case: Trying to annotate using @bit_bound with additional parameters
2664
+ builder = factory->create_type_w_uri (" IDL/bit_bound_annotation.idl" , " bit_bound_ann_extra_parameter_enum" ,
2665
+ include_paths);
2666
+ ASSERT_FALSE (builder);
2667
+
2668
+ // Negative case: Trying to annotate a non-primitive type different from bitset/bitmask with @bit_bound
2669
+ builder = factory->create_type_w_uri (" IDL/bit_bound_annotation.idl" , " bit_bound_ann_on_struct" ,
2670
+ include_paths);
2671
+ ASSERT_FALSE (builder);
2672
+ }
2673
+
2674
+ TEST_F (IdlParserTests, external_builtin_annotation)
2675
+ {
2676
+ DynamicTypeBuilderFactory::_ref_type factory {DynamicTypeBuilderFactory::get_instance ()};
2677
+ MemberDescriptor::_ref_type member_descriptor{traits<MemberDescriptor>::make_shared ()};
2678
+ std::vector<std::string> include_paths;
2679
+
2680
+ include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2681
+
2682
+ // Set external annotation on struct members and check that they are correctly parsed
2683
+ DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/external_annotation.idl" , " external_ann_struct_valid" ,
2684
+ include_paths);
2685
+ DynamicTypeMember::_ref_type member;
2686
+ ASSERT_TRUE (builder);
2687
+ EXPECT_EQ (builder->get_member (member, 0 ), RETCODE_OK);
2688
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2689
+ EXPECT_TRUE (member_descriptor->is_shared ());
2690
+ EXPECT_EQ (builder->get_member (member, 1 ), RETCODE_OK);
2691
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2692
+ EXPECT_FALSE (member_descriptor->is_shared ());
2693
+ EXPECT_EQ (builder->get_member (member, 2 ), RETCODE_OK);
2694
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2695
+ EXPECT_FALSE (member_descriptor->is_shared ());
2696
+
2697
+ // Negative case: Trying to annotate using @external with invalid value type
2698
+ builder = factory->create_type_w_uri (" IDL/external_annotation.idl" , " external_ann_invalid_value_type" ,
2699
+ include_paths);
2700
+ ASSERT_FALSE (builder);
2701
+
2702
+ // Negative case: Trying to annotate using @external with additional parameters
2703
+ builder = factory->create_type_w_uri (" IDL/external_annotation.idl" , " external_ann_extra_parameter" ,
2704
+ include_paths);
2705
+ ASSERT_FALSE (builder);
2706
+
2707
+ // Negative case: Trying to annotate a constructed type with @external
2708
+ builder = factory->create_type_w_uri (" IDL/external_annotation.idl" , " external_ann_on_struct" ,
2709
+ include_paths);
2710
+ ASSERT_FALSE (builder);
2711
+ }
2712
+
2713
+ TEST_F (IdlParserTests, nested_builtin_annotation)
2714
+ {
2715
+ DynamicTypeBuilderFactory::_ref_type factory {DynamicTypeBuilderFactory::get_instance ()};
2716
+ TypeDescriptor::_ref_type type_descriptor{traits<TypeDescriptor>::make_shared ()};
2717
+ std::vector<std::string> include_paths;
2718
+
2719
+ include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2720
+
2721
+ // Set nested annotations on struct (constructed type) and check that they are correctly parsed
2722
+ DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/nested_annotation.idl" , " nested_ann_struct_valid" ,
2723
+ include_paths);
2724
+ ASSERT_TRUE (builder);
2725
+ EXPECT_EQ (builder->get_descriptor (type_descriptor), RETCODE_OK);
2726
+ EXPECT_EQ (type_descriptor->is_nested (), true );
2727
+ builder = factory->create_type_w_uri (" IDL/nested_annotation.idl" , " nested_ann_struct_keyword_valid" ,
2728
+ include_paths);
2729
+ ASSERT_TRUE (builder);
2730
+ EXPECT_EQ (builder->get_descriptor (type_descriptor), RETCODE_OK);
2731
+ EXPECT_EQ (type_descriptor->is_nested (), true );
2732
+
2733
+ // Negative case: Trying to annotate using @nested with invalid value type
2734
+ builder = factory->create_type_w_uri (" IDL/nested_annotation.idl" , " nested_ann_struct_invalid_value_type" ,
2735
+ include_paths);
2736
+ ASSERT_FALSE (builder);
2737
+
2738
+ // Negative case: Trying to annotate using @nested with extra parameters
2739
+ builder = factory->create_type_w_uri (" IDL/nested_annotation.idl" , " nested_ann_struct_extra_parameter" ,
2740
+ include_paths);
2741
+ ASSERT_FALSE (builder);
2742
+
2743
+ // Negative case: Trying to annotate a member with @nested
2744
+ builder = factory->create_type_w_uri (" IDL/nested_annotation.idl" , " nested_ann_on_member" ,
2745
+ include_paths);
2746
+ ASSERT_FALSE (builder);
2747
+ }
2748
+
2749
+ TEST_F (IdlParserTests, try_construct_builtin_annotation)
2750
+ {
2751
+ DynamicTypeBuilderFactory::_ref_type factory {DynamicTypeBuilderFactory::get_instance ()};
2752
+ MemberDescriptor::_ref_type member_descriptor{traits<MemberDescriptor>::make_shared ()};
2753
+ std::vector<std::string> include_paths;
2754
+
2755
+ include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2756
+
2757
+ // Set try_construct annotation on struct members and check that they are correctly parsed
2758
+ DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/try_construct_annotation.idl" , " try_construct_ann_struct_valid" ,
2759
+ include_paths);
2760
+ ASSERT_TRUE (builder);
2761
+ DynamicTypeMember::_ref_type member;
2762
+ EXPECT_EQ (builder->get_member (member, 0 ), RETCODE_OK);
2763
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2764
+ EXPECT_EQ (member_descriptor->try_construct_kind (), TryConstructKind::USE_DEFAULT);
2765
+ EXPECT_EQ (builder->get_member (member, 1 ), RETCODE_OK);
2766
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2767
+ EXPECT_EQ (member_descriptor->try_construct_kind (), TryConstructKind::USE_DEFAULT);
2768
+ EXPECT_EQ (builder->get_member (member, 2 ), RETCODE_OK);
2769
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2770
+ EXPECT_EQ (member_descriptor->try_construct_kind (), TryConstructKind::TRIM);
2771
+ // TODO (For some reason, maybe a PEGTL bug, "DISCARD" identifier is not parsed correctly, matching only "D"). Uncomment when fixed.
2772
+ // EXPECT_EQ(builder->get_member(member, 3), RETCODE_OK);
2773
+ // EXPECT_EQ(member->get_descriptor(member_descriptor), RETCODE_OK);
2774
+ // EXPECT_EQ(member_descriptor->try_construct_kind(), TryConstructKind::DISCARD);
2775
+
2776
+ // Negative case: Trying to annotate using @try_construct with invalid value type
2777
+ builder = factory->create_type_w_uri (" IDL/try_construct_annotation.idl" , " try_construct_ann_invalid_value_type" ,
2778
+ include_paths);
2779
+ ASSERT_FALSE (builder);
2780
+ }
2781
+
2782
+ TEST_F (IdlParserTests, value_builtin_annotation)
2783
+ {
2784
+ DynamicTypeBuilderFactory::_ref_type factory {DynamicTypeBuilderFactory::get_instance ()};
2785
+ MemberDescriptor::_ref_type member_descriptor{traits<MemberDescriptor>::make_shared ()};
2786
+ std::vector<std::string> include_paths;
2787
+
2788
+ include_paths.push_back (" IDL/helpers/basic_inner_types.idl" );
2789
+
2790
+ // Set value annotation on struct members and check that they are correctly parsed
2791
+ DynamicTypeBuilder::_ref_type builder = factory->create_type_w_uri (" IDL/value_annotation.idl" , " value_ann_valid_struct" ,
2792
+ include_paths);
2793
+ ASSERT_TRUE (builder);
2794
+ DynamicTypeMember::_ref_type member;
2795
+ EXPECT_EQ (builder->get_member (member, 0 ), RETCODE_OK);
2796
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2797
+ EXPECT_EQ (member_descriptor->default_value (), " foo" );
2798
+ EXPECT_EQ (builder->get_member (member, 1 ), RETCODE_OK);
2799
+ EXPECT_EQ (member->get_descriptor (member_descriptor), RETCODE_OK);
2800
+ EXPECT_EQ (member_descriptor->default_value (), " 8" );
2801
+
2802
+ // Negative case: Trying to annotate using @value with invalid value type
2803
+ builder = factory->create_type_w_uri (" IDL/value_annotation.idl" , " value_ann_invalid_value_type_struct" ,
2804
+ include_paths);
2805
+ ASSERT_FALSE (builder);
2806
+
2807
+ // Negative case: Trying to annotate using @value with additional parameters
2808
+ builder = factory->create_type_w_uri (" IDL/value_annotation.idl" , " value_ann_extra_parameter_struct" ,
2809
+ include_paths);
2810
+ ASSERT_FALSE (builder);
2811
+
2812
+ // Negative case: Trying to annotate a constructed type with @value
2813
+ builder = factory->create_type_w_uri (" IDL/value_annotation.idl" , " value_ann_on_struct" ,
2814
+ include_paths);
2815
+ ASSERT_FALSE (builder);
2599
2816
}
2600
2817
2601
2818
int main (
0 commit comments