generate_code.pl 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/usr/bin/perl
  2. #
  3. use strict;
  4. my $suite_dir = shift or die "Missing suite directory";
  5. my $suite_name = shift or die "Missing suite name";
  6. my $data_name = shift or die "Missing data name";
  7. my $test_file = $data_name.".c";
  8. my $test_helper_file = $suite_dir."/helpers.function";
  9. my $test_case_file = $suite_dir."/".$suite_name.".function";
  10. my $test_data_file = $suite_dir."/".$data_name.".data";
  11. open(TEST_DATA, "$test_data_file") or die "Opening test cases '$test_data_file': $!";
  12. my $line_separator = $/;
  13. undef $/;
  14. open(TEST_HELPERS, "$test_helper_file") or die "Opening test helpers '$test_helper_file': $!";
  15. my $test_helpers = <TEST_HELPERS>;
  16. close(TEST_HELPERS);
  17. open(TEST_CASES, "$test_case_file") or die "Opening test cases '$test_case_file': $!";
  18. my $test_cases = <TEST_CASES>;
  19. close(TEST_CASES);
  20. my ( $suite_header ) = $test_cases =~ /BEGIN_HEADER\n(.*?)\nEND_HEADER/s;
  21. my ( $suite_defines ) = $test_cases =~ /BEGIN_DEPENDENCIES\n(.*?)\nEND_DEPENDENCIES/s;
  22. my $requirements;
  23. if ($suite_defines =~ /^depends_on:/)
  24. {
  25. ( $requirements ) = $suite_defines =~ /^depends_on:(.*)$/;
  26. }
  27. my @var_req_arr = split(/:/, $requirements);
  28. my $suite_pre_code;
  29. my $suite_post_code;
  30. while (@var_req_arr)
  31. {
  32. my $req = shift @var_req_arr;
  33. $suite_pre_code .= "#ifdef $req\n";
  34. $suite_post_code .= "#endif /* $req */\n";
  35. }
  36. $/ = $line_separator;
  37. open(TEST_FILE, ">$test_file") or die "Opening destination file '$test_file': $!";
  38. print TEST_FILE << "END";
  39. #include "fct.h"
  40. $suite_header
  41. $test_helpers
  42. FCT_BGN()
  43. {
  44. $suite_pre_code
  45. FCT_SUITE_BGN($suite_name)
  46. {
  47. END
  48. while (my $line = <TEST_DATA>)
  49. {
  50. my $description = $line;
  51. $line = <TEST_DATA>;
  52. my $test_name = $description;
  53. $test_name =~ tr/A-Z \-/a-z__/;
  54. $test_name =~ tr/a-z0-9_//cd;
  55. # Carve the defines required for this test case
  56. my $requirements;
  57. if ($line =~ /^depends_on:/)
  58. {
  59. my $depends_on_line = $line;
  60. $line = <TEST_DATA>;
  61. ( $requirements ) = $depends_on_line =~ /^depends_on:(.*)$/;
  62. }
  63. my @var_req_arr = split(/:/, $requirements);
  64. my $pre_code;
  65. my $post_code;
  66. while (@var_req_arr)
  67. {
  68. my $req = shift @var_req_arr;
  69. $pre_code .= "#ifdef $req\n";
  70. $post_code .= "#endif /* $req */\n";
  71. }
  72. my $command_line = $line;
  73. $line = <TEST_DATA>;
  74. # Carve the case name and variable values
  75. #
  76. my ( $case, $var_value ) = $command_line =~ /^([\w_]+):(.*)$/;
  77. # Escape the escaped colons (Not really escaped now)
  78. #
  79. $var_value =~ s/\\:/{colon_sign}/g;
  80. # Carve the case and variable definition
  81. #
  82. my ( $var_def, $case_code ) = $test_cases =~ /BEGIN_CASE\n$case:([^\n]*)\n(.*?)\nEND_CASE/s;
  83. my @var_def_arr = split(/:/, $var_def);
  84. my @var_value_arr = split(/:/, $var_value);
  85. while (@var_def_arr)
  86. {
  87. my $def = shift @var_def_arr;
  88. my $val = shift @var_value_arr;
  89. $case_code =~ s/\{$def\}/$val/g;
  90. }
  91. $case_code = "int ${test_name}_code_present = 0;\nTEST_ASSERT( ${test_name}_code_present == 1 );" if ($case_code =~ /^\s*$/);
  92. $case_code =~ s/{colon_sign}/:/g;
  93. $case_code =~ s/TEST_ASSERT/fct_chk/g;
  94. $case_code =~ s/TEST_EQUALS/fct_chk/g;
  95. $case_code =~ s/^/ /gm;
  96. print TEST_FILE << "END";
  97. $pre_code
  98. FCT_TEST_BGN($test_name)
  99. $case_code
  100. FCT_TEST_END();
  101. $post_code
  102. END
  103. }
  104. print TEST_FILE << "END";
  105. }
  106. FCT_SUITE_END();
  107. $suite_post_code
  108. }
  109. FCT_END();
  110. END
  111. close(TEST_DATA);
  112. close(TEST_FILE);