testygen revision 5c526acb82c882e41b655c31f5fa4425c87b671c
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User# Copyright (c) 2002 Japan Network Information Center.
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User# All rights reserved.
e9e4257668ff6c4e583b0c0db2508650b0b677b8Tinderbox User# By using this file, you agree to the terms and conditions set forth bellow.
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews# LICENSE TERMS AND CONDITIONS
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews# The following License Terms and Conditions apply, unless a different
8de3f14f1c300c3e1ed99084cc03485b42c92bf1Tinderbox User# license is obtained from Japan Network Information Center ("JPNIC"),
950d203b64f512b85fcc093ee1e9e3e531a1aea3Tinderbox User# a Japanese association, Kokusai-Kougyou-Kanda Bldg 6F, 2-3-4 Uchi-Kanda,
b886b04d8d2b085cbf3e1bf4442dee87f43ba5e4Tinderbox User# Chiyoda-ku, Tokyo 101-0047, Japan.
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# 1. Use, Modification and Redistribution (including distribution of any
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# modified or derived work) in source and/or binary forms is permitted
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# under this License Terms and Conditions.
a7c412f37cc73d0332887a746e81220cbf09dd00Mark Andrews# 2. Redistribution of source code must retain the copyright notices as they
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# appear in each source code file, this License Terms and Conditions.
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# 3. Redistribution in binary form must reproduce the Copyright Notice,
e676a596869d8a80a644c99a848afb53d1c5975eMark Andrews# this License Terms and Conditions, in the documentation and/or other
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews# materials provided with the distribution. For the purposes of binary
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# distribution the "Copyright Notice" refers to the following language:
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# "Copyright (c) 2000-2002 Japan Network Information Center. All rights reserved."
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# 4. The name of JPNIC may not be used to endorse or promote products
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# derived from this Software without specific prior written approval of
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews# 5. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY JPNIC
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JPNIC BE LIABLE
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
b886b04d8d2b085cbf3e1bf4442dee87f43ba5e4Tinderbox User# ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
9513a2a6670951f5cf5477fcfec9f933fcaff628Automatic Updater# Parsing status.
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# Create a new testsuite context.
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews# Read `$file' and put the result into `$testsutie'.
18920d790825d96ca3943aa2dcb6eb80dc611c5fTinderbox User $result = parse_line($testsuite, $parser, $line);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $result = parse_header($testsuite, $parser, $line);
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $result = parse_endheader($testsuite, $parser, $line);
28a5dd720187fddb16055a0f64b63a7b66f29f64Mark Andrews $result = parse_endheader($testsuite, $parser, $line)
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews && parse_startbody($testsuite, $parser, $line);
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User } elsif ($parser->{status} == $STATUS_HEADER_COMMENT) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $result = parse_endheader($testsuite, $parser, $line);
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $result = parse_endheader($testsuite, $parser, $line)
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews && parse_startbody($testsuite, $parser, $line);
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews } elsif ($parser->{status} == $STATUS_SEPARATOR) {
dc238a06bffa79de141ee7655765e2df91498a8aTinderbox User $result = parse_startbody($testsuite, $parser, $line);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $result = parse_endbody($testsuite, $parser, $line);
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $result = parse_body($testsuite, $parser, $line);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User } elsif ($parser->{status} == $STATUS_GLOBAL) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $result = parse_startheader($testsuite, $parser, $line);
fe80a4909bf62b602feaf246866e9d29f7654194Automatic Updater } elsif ($parser->{status} == $STATUS_GLOBAL_COMMENT) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews } elsif ($parser->{status} == $STATUS_PREAMBLE) {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $result = parse_startheader($testsuite, $parser, $line);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $result = parse_preamble($testsuite, $parser, $line);
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User if ($line =~ /^\/\/\#\s*(SETUP|TEARDOWN|TESTCASE)\s*$/) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $parser->{type} = $1;
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $parser->{error} = 'invalid test-header format';
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $field =~ s/^\/\/\s*//;
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $parser->{error} = "group defined twice in a header";
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User if (defined($testsuite->{setups}->{$group})) {
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $parser->{error} = sprintf("SETUP \`%s' redefined", $group);
37d8e0a4455876fe1e4cca511076cc2c5ab9eedeTinderbox User if (defined($testsuite->{teardowns}->{$group})) {
91d187ce035f39073f0732ff2a401a45c3c955fbMark Andrews $parser->{error} = sprintf("TEARDOWN \`%s' redefined", $group);
9cd5eb6fe0f26d65724b99216cb31dcdd12e4afdAutomatic Updater $parser->{error} = "invalid group name \`$i'";
91d187ce035f39073f0732ff2a401a45c3c955fbMark Andrews $parser->{error} = sprintf("group \'%s' not defined", $i);
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater $parser->{error} = "title defined twice in a header";
ce9cad6bb04869c5e94d9dc721032b25117f9210Automatic Updater if ($title =~ /[\x00-\x1f\x7f-\xff\"\\]/ || $title eq '') {
757ff043760e4743dda1a10e7d58349275934902Tinderbox User $parser->{error} = sprintf("title for %s is not permitted",
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $parser->{error} = "invalid test-header field";
b886b04d8d2b085cbf3e1bf4442dee87f43ba5e4Tinderbox User if ($parser->{type} ne 'TESTCASE' && $parser->{group} eq '') {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $parser->{error} = "missing \`group' in the header";
c651f15b30f1dae5cc2f00878fb5da5b3a35a468Mark Andrews if ($parser->{type} eq 'TESTCASE' && $parser->{title} eq '') {
9ecb5d33470ebfb3719a1b8d56bcefdf4b27f7b2Tinderbox User $parser->{error} = "missing \`title' in the header";
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews generate_line_info($parser->{lineno} + 1, $parser->{file});
78f3ed4bc2fcd3d270bfd599804f3b27a1db4d91Mark Andrews generate_line_info($parser->{lineno} + 1, $parser->{file});
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews push(@{$testsuite->{titles}}, $parser->{title});
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews sprintf("static void\ntestcase\%d(idn_testsuite_t ctx__) {\n",
e8fc8c884b44371784805e1e0d3100da403dd3f1Automatic Updater if (defined($testsuite->{setups}->{$group_names[$i]})) {
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $testsuite->{tests}->[-1] .= "#undef EXIT__\n";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $testsuite->{tests}->[-1] .= "#define EXIT__ exit${i}__\n";
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $testsuite->{tests}->[-1] .= "#undef EXIT__\n";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews $testsuite->{tests}->[-1] .= "#define EXIT__ exit__\n";
dedefc0bdbb4e6e39eeb98aa2fc6883efec2ddb0Mark Andrews generate_line_info($parser->{lineno} + 1, $parser->{file});
91216cff91b34c9ff6e846dc23f248219cafe660Andreas Gustafsson $testsuite->{tests}->[-1] .= "$LINENO_MARK\n";
efb0e886f18894a1d2489f1ad74ad14b579e11c7Mark Andrews for (my $i = @group_names - 1; $i >= 0; $i--) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews if (defined($testsuite->{teardowns}->{$group_names[$i]})) {
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington $testsuite->{teardowns}->{$group_names[$i]};
a5636b773fa05a272b6876afd99309c0b3090e2fMark Andrews if ($parser->{lineinfo} && $parser->{lineno} == 1) {
a5636b773fa05a272b6876afd99309c0b3090e2fMark Andrews $testsuite->{preambles} .= generate_line_info(1, $parser->{file});
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington# Output `$testsuite' as source codes of C.
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington die "failed to open the file, $!: $file\n";
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington "/* This file is automatically generated by testygen. */\n\n"
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington output_lines($preamble_header, $generator, $handle, $lineinfo);
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington output_lines($testsuite->{preambles}, $generator, $handle, $lineinfo);
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington output_lines($preamble_footer, $generator, $handle, $lineinfo);
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington for (my $i = 0; $i < $testsuite->{ntests}; $i++) {
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington output_lines($testsuite->{tests}->[$i], $generator, $handle,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington output_lines($main_header, $generator, $handle, $lineinfo);
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews for (my $i = 0; $i < $testsuite->{ntests}; $i++) {
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews output_lines("\tidn_testsuite_addtestcase(ctx, \"$title\", $proc);\n",
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater . "\tif (argc > 1 && strcmp(argv[1], \"-v\") == 0) {\n"
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater . "\t idn_testsuite_run(ctx, argv + 1);\n"
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater . "\tprintf(\"passed=%d, failed=%d, total=%d\\n\",\n"
ae7e54b14c946e0984c191554db9abb4893f9349Automatic Updater . "\t idn_testsuite_ntestcases(ctx) - idn_testsuite_nskipped(ctx));\n"
c11c7b47726c02eb05e29ff7be56a3343146e396Tinderbox User output_lines($main_footer, $generator, $handle, $lineinfo);
c11c7b47726c02eb05e29ff7be56a3343146e396Tinderbox User my ($lines, $generator, $handle, $lineinfo) = @_;
0eb371ca0dab50ae3462e98794a6126198c52f4bMark Andrews $handle->printf("#line %d \"%s\"\n", $generator->{lineno} + 1,
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellington $out_file .= '\.tsy' if ($out_file !~ /\.tsy$/);
9e3a7b0faf417a10f5f689edf288807b2d5eedc5Brian Wellingtonparse_file($testsuite, $in_file, !$options{L});