From 9d608d61d3d7d079d1382d22bbdd58ab61053e19 Mon Sep 17 00:00:00 2001 From: mkarlesky Date: Fri, 22 May 2009 21:50:00 +0000 Subject: [PATCH] added enum handling to parser; updated comments in test files produced in system test file generation git-svn-id: http://cmock.svn.sourceforge.net/svnroot/cmock/trunk@104 bf332499-1b4d-0410-844d-d2d48d5cc64c --- lib/cmock_config.rb | 2 +- lib/cmock_function_prototype_parser.rb | 81 +++++++++++- lib/cmock_function_prototype_parser.treetop | 5 + ...> struct_union_enum_expect_and_return.yml} | 117 ++++++++++++++---- test/system/systest_generator.rb | 2 +- 5 files changed, 178 insertions(+), 29 deletions(-) rename test/system/cases/{struct_union_expect_and_return.yml => struct_union_enum_expect_and_return.yml} (60%) diff --git a/lib/cmock_config.rb b/lib/cmock_config.rb index 0868a21..638b94d 100644 --- a/lib/cmock_config.rb +++ b/lib/cmock_config.rb @@ -7,7 +7,7 @@ class CMockConfig :mock_prefix => 'Mock', :plugins => ['cexception', 'ignore'], :includes => [], - :attributes => ['static', 'inline', 'extern', '__ramfunc', '__irq', '__fiq'], + :attributes => ['static', 'inline', 'extern', 'auto', 'register', '__ramfunc', '__irq', '__fiq'], :tab => ' ', :expect_call_count_type => 'unsigned short', :enforce_strict_ordering => false, diff --git a/lib/cmock_function_prototype_parser.rb b/lib/cmock_function_prototype_parser.rb index 8d014b4..bfcdd02 100644 --- a/lib/cmock_function_prototype_parser.rb +++ b/lib/cmock_function_prototype_parser.rb @@ -529,20 +529,25 @@ module CMockFunctionPrototype if r5 r3 = r5 else - r6 = _nt_type_void_ptr + r6 = _nt_type_enum if r6 r3 = r6 else - r7 = _nt_type_primitive + r7 = _nt_type_void_ptr if r7 r3 = r7 else - r8 = _nt_type_custom + r8 = _nt_type_primitive if r8 r3 = r8 else - self.index = i3 - r3 = nil + r9 = _nt_type_custom + if r9 + r3 = r9 + else + self.index = i3 + r3 = nil + end end end end @@ -695,6 +700,72 @@ module CMockFunctionPrototype return r0 end + module TypeEnum0 + def space + elements[1] + end + + def name + elements[2] + end + + def space + elements[3] + end + + end + + def _nt_type_enum + start_index = index + if node_cache[:type_enum].has_key?(index) + cached = node_cache[:type_enum][index] + @index = cached.interval.end if cached + return cached + end + + i0, s0 = index, [] + if input.index('enum', index) == index + r1 = instantiate_node(SyntaxNode,input, index...(index + 4)) + @index += 4 + else + terminal_parse_failure('enum') + r1 = nil + end + s0 << r1 + if r1 + r2 = _nt_space + s0 << r2 + if r2 + r3 = _nt_name + s0 << r3 + if r3 + r4 = _nt_space + s0 << r4 + if r4 + r6 = _nt_type_const_and_ptr_suffix + if r6 + r5 = r6 + else + r5 = instantiate_node(SyntaxNode,input, index...index) + end + s0 << r5 + end + end + end + end + if s0.last + r0 = instantiate_node(SyntaxNode,input, i0...index, s0) + r0.extend(TypeEnum0) + else + self.index = i0 + r0 = nil + end + + node_cache[:type_enum][start_index] = r0 + + return r0 + end + module TypeVoidPtr0 def space elements[1] diff --git a/lib/cmock_function_prototype_parser.treetop b/lib/cmock_function_prototype_parser.treetop index ae24d8a..c1a40b0 100644 --- a/lib/cmock_function_prototype_parser.treetop +++ b/lib/cmock_function_prototype_parser.treetop @@ -52,6 +52,7 @@ grammar CMockFunctionPrototype const? ( type_struct / type_union / + type_enum / type_void_ptr / type_primitive / type_custom ) @@ -65,6 +66,10 @@ grammar CMockFunctionPrototype 'union' space name space type_const_and_ptr_suffix? end + rule type_enum + 'enum' space name space type_const_and_ptr_suffix? + end + rule type_void_ptr 'void' space type_const_and_ptr_suffix end diff --git a/test/system/cases/struct_union_expect_and_return.yml b/test/system/cases/struct_union_enum_expect_and_return.yml similarity index 60% rename from test/system/cases/struct_union_expect_and_return.yml rename to test/system/cases/struct_union_enum_expect_and_return.yml index 6c7a01d..d4cf6af 100644 --- a/test/system/cases/struct_union_expect_and_return.yml +++ b/test/system/cases/struct_union_enum_expect_and_return.yml @@ -7,20 +7,30 @@ :types: | struct THING { int a; int b; }; - union JUNK { int a; char b; }; + union STARS_AND_STRIPES { int a; char b; }; + + enum HOKEY_POKEY { IN, OUT, SHAKE_IT_ALL_ABOUT }; :mockable: | void foo_struct(struct THING*, struct THING); - void foo_union(union JUNK*, union JUNK); struct THING foobar_struct(void); - union JUNK foobar_union(void); + + void foo_union(union STARS_AND_STRIPES*, union STARS_AND_STRIPES); + union STARS_AND_STRIPES foobar_union(void); + + void foo_enum(enum HOKEY_POKEY a, enum HOKEY_POKEY * b); + enum HOKEY_POKEY foobar_enum(void); :source: :header: | void exercise_struct(struct THING* a, struct THING b); - void exercise_union(union JUNK* a, union JUNK b); struct THING return_struct(void); - union JUNK return_union(void); + + void exercise_union(union STARS_AND_STRIPES* a, union STARS_AND_STRIPES b); + union STARS_AND_STRIPES return_union(void); + + void exercise_enum(enum HOKEY_POKEY a, enum HOKEY_POKEY * b); + enum HOKEY_POKEY return_enum(void); :code: | void exercise_struct(struct THING* a, struct THING b) @@ -28,21 +38,32 @@ foo_struct(a, b); } - void exercise_union(union JUNK* a, union JUNK b) - { - foo_union(a, b); - } - struct THING return_struct(void) { return foobar_struct(); } - union JUNK return_union(void) + void exercise_union(union STARS_AND_STRIPES* a, union STARS_AND_STRIPES b) + { + foo_union(a, b); + } + + union STARS_AND_STRIPES return_union(void) { return foobar_union(); } + void exercise_enum(enum HOKEY_POKEY a, enum HOKEY_POKEY * b) + { + foo_enum(a, b); + } + + enum HOKEY_POKEY return_enum(void) + { + return foobar_enum(); + } + + :tests: :common: | struct THING struct1; @@ -52,12 +73,15 @@ struct THING struct5; struct THING struct6; - union JUNK union1; - union JUNK union2; - union JUNK union3; - union JUNK union4; - union JUNK union5; - union JUNK union6; + union STARS_AND_STRIPES union1; + union STARS_AND_STRIPES union2; + union STARS_AND_STRIPES union3; + union STARS_AND_STRIPES union4; + union STARS_AND_STRIPES union5; + union STARS_AND_STRIPES union6; + + enum HOKEY_POKEY enum1; + enum HOKEY_POKEY enum2; void setUp(void) { @@ -85,6 +109,9 @@ union4.a = 4; union5.a = 5; union6.a = 5; + + enum1 = OUT; + enum2 = IN; } void tearDown(void) {} @@ -168,7 +195,7 @@ test() { foobar_union_ExpectAndReturn(union5); - TEST_ASSERT_EQUAL_JUNK(union6, return_union()); + TEST_ASSERT_EQUAL_STARS_AND_STRIPES(union6, return_union()); } - :pass: FALSE @@ -177,16 +204,62 @@ test() { foobar_union_ExpectAndReturn(union4); - TEST_ASSERT_EQUAL_JUNK(union5, return_union()); + TEST_ASSERT_EQUAL_STARS_AND_STRIPES(union5, return_union()); } + - :pass: TRUE + :should: 'successfully pass enum values' + :code: | + test() + { + foo_enum_Expect(OUT, &enum1); + exercise_enum(OUT, &enum1); + } + + - :pass: FALSE + :should: 'blow up on bad enum pointer comparison' + :code: | + test() + { + foo_enum_Expect(IN, &enum1); + exercise_enum(IN, &enum2); + } + + - :pass: FALSE + :should: 'blow up on bad enum comparison' + :code: | + test() + { + foo_enum_Expect(IN, &enum1); + exercise_enum(SHAKE_IT_ALL_ABOUT, &enum1); + } + + - :pass: TRUE + :should: 'compare returned enums as equal' + :code: | + test() + { + foobar_enum_ExpectAndReturn(OUT); + TEST_ASSERT_EQUAL(OUT, return_enum()); + } + + - :pass: FALSE + :should: 'compare returned unions as unequal' + :code: | + test() + { + foobar_enum_ExpectAndReturn(OUT); + TEST_ASSERT_EQUAL(IN, return_enum()); + } + + :unity_helper: :header: | void AssertEqualTHINGStruct(struct THING expected, struct THING actual); - void AssertEqualJUNKUnion(union JUNK expected, union JUNK actual); + void AssertEqualSTARS_AND_STRIPESUnion(union STARS_AND_STRIPES expected, union STARS_AND_STRIPES actual); #define TEST_ASSERT_EQUAL_THING(expected, actual) {AssertEqualTHINGStruct(expected, actual);} - #define TEST_ASSERT_EQUAL_JUNK(expected, actual) {AssertEqualJUNKUnion(expected, actual);} + #define TEST_ASSERT_EQUAL_STARS_AND_STRIPES(expected, actual) {AssertEqualSTARS_AND_STRIPESUnion(expected, actual);} :code: | void AssertEqualTHINGStruct(struct THING expected, struct THING actual) @@ -195,7 +268,7 @@ TEST_ASSERT_EQUAL_INT_MESSAGE(expected.b, actual.b, "actual struct member \"b\" does not equal expected"); } - void AssertEqualJUNKUnion(union JUNK expected, union JUNK actual) + void AssertEqualSTARS_AND_STRIPESUnion(union STARS_AND_STRIPES expected, union STARS_AND_STRIPES actual) { TEST_ASSERT_EQUAL_INT_MESSAGE(expected.a, actual.a, "actual union member \"a\" does not equal expected"); TEST_ASSERT_EQUAL_MESSAGE(expected.b, actual.b, "actual union member \"b\" does not equal expected"); diff --git a/test/system/systest_generator.rb b/test/system/systest_generator.rb index a899563..7bdd8bd 100644 --- a/test/system/systest_generator.rb +++ b/test/system/systest_generator.rb @@ -107,7 +107,7 @@ class SystemTestGenerator out.puts('') tests[:units].each_with_index do |test, index| - out.puts('// ' + test[:should]) + out.puts('// should ' + test[:should]) out.puts(test[:code].gsub!(/test\(\)/, "void test#{index+1}(void)")) out.puts('') end