diff --git a/lab-3/main_test.c b/lab-3/main_test.c index 02dc1c4..1eb729a 100644 --- a/lab-3/main_test.c +++ b/lab-3/main_test.c @@ -312,4 +312,273 @@ UTEST(scanner, quadratic) { ASSERT_STREQ(tokens[index].p, yytext); ++index; } while (t != TOKEN_EOF); +} + +UTEST(scanner, sorting) { + struct token_st tokens[] = { + {TOKEN_IDENTIFICATION, "IDENTIFICATION"}, + {TOKEN_KEYWORD_DIVISION, "DIVISION"}, + {TOKEN_DOT, "."}, + {TOKEN_PROGRAM_ID, "PROGRAM-ID"}, + {TOKEN_DOT, "."}, + {TOKEN_IDENT, "sorting"}, + {TOKEN_DOT, "."}, + {TOKEN_KEYWORD_DATA, "DATA"}, + {TOKEN_KEYWORD_DIVISION, "DIVISION"}, + {TOKEN_DOT, "."}, + {TOKEN_WORKING_STORAGE, "WORKING-STORAGE"}, + {TOKEN_KEYWORD_SECTION, "SECTION"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "01"}, + {TOKEN_IDENT, "WS-SORT-AREA"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-SORT-TABLE"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "10"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_ALPHANUMERIC, "X"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "10"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_KEYWORD_OCCURS, "OCCURS"}, + {TOKEN_INTEGER, "100"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-TEMP-ROW"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_ALPHANUMERIC, "X"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "10"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-ROW-MAX"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_SIGNED_NUMERIC, "S9"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_COMPUTATION_LEVEL_0, "COMP"}, + {TOKEN_KEYWORD_VALUE, "VALUE"}, + {TOKEN_INTEGER, "100"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_SIGNED_NUMERIC, "S9"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_COMPUTATION_LEVEL_0, "COMP"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-I"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_SIGNED_NUMERIC, "S9"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_COMPUTATION_LEVEL_0, "COMP"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_SIGNED_NUMERIC, "S9"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_COMPUTATION_LEVEL_0, "COMP"}, + {TOKEN_DOT, "."}, + {TOKEN_INTEGER, "05"}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_PICTURE, "PIC"}, + {TOKEN_SIGNED_NUMERIC, "S9"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_COMPUTATION_LEVEL_0, "COMP"}, + {TOKEN_DOT, "."}, + {TOKEN_PROCEDURE, "PROCEDURE"}, + {TOKEN_KEYWORD_DIVISION, "DIVISION"}, + {TOKEN_DOT, "."}, + {TOKEN_COMMENT, "*> Initialize test data"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_STRING, "\"30\""}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "1"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_STRING, "\"10\""}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "2"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_STRING, "\"50\""}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "3"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_STRING, "\"20\""}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "4"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_STRING, "\"40\""}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_INTEGER, "5"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_INTEGER, "5"}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_COMMENT, "*> * Display original array"}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"Original Array Contents:\""}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"---------------------\""}, + {TOKEN_PERFORM, "PERFORM"}, + {TOKEN_VARYING, "VARYING"}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_KEYWORD_FROM, "FROM"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_KEYWORD_BY, "BY"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_UNTIL, "UNTIL"}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_GREATER_THAN, ">"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"Element \""}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_STRING, "\": \""}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_END_PERFORM, "END-PERFORM"}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_SPACE, "SPACE"}, + {TOKEN_COMMENT, "*> * Simplified bubble sort"}, + {TOKEN_PERFORM, "PERFORM"}, + {TOKEN_VARYING, "VARYING"}, + {TOKEN_IDENT, "WS-I"}, + {TOKEN_KEYWORD_FROM, "FROM"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_KEYWORD_BY, "BY"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_UNTIL, "UNTIL"}, + {TOKEN_IDENT, "WS-I"}, + {TOKEN_GREATER_THAN, ">"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_SUB, "-"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_PERFORM, "PERFORM"}, + {TOKEN_VARYING, "VARYING"}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_KEYWORD_FROM, "FROM"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_KEYWORD_BY, "BY"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_UNTIL, "UNTIL"}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_GREATER_THAN, ">"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_SUB, "-"}, + {TOKEN_IDENT, "WS-I"}, + {TOKEN_IF, "IF"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_GREATER_THAN, ">"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_ADD, "+"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-TEMP-ROW"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_ADD, "+"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_MOVE, "MOVE"}, + {TOKEN_IDENT, "WS-TEMP-ROW"}, + {TOKEN_KEYWORD_TO, "TO"}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-J"}, + {TOKEN_ADD, "+"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_END_IF, "END-IF"}, + {TOKEN_END_PERFORM, "END-PERFORM"}, + {TOKEN_END_PERFORM, "END-PERFORM"}, + {TOKEN_COMMENT, "*> * Display sorted array"}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"Sorted Array Contents:\""}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"--------------------\""}, + {TOKEN_PERFORM, "PERFORM"}, + {TOKEN_VARYING, "VARYING"}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_KEYWORD_FROM, "FROM"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_KEYWORD_BY, "BY"}, + {TOKEN_INTEGER, "1"}, + {TOKEN_UNTIL, "UNTIL"}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_GREATER_THAN, ">"}, + {TOKEN_IDENT, "WS-SORT-MAX"}, + {TOKEN_DISPLAY, "DISPLAY"}, + {TOKEN_STRING, "\"Element \""}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_STRING, "\": \""}, + {TOKEN_IDENT, "WS-SORT-ROW"}, + {TOKEN_LEFT_PARENTHESIS, "("}, + {TOKEN_IDENT, "WS-INDEX"}, + {TOKEN_RIGHT_PARENTHESIS, ")"}, + {TOKEN_END_PERFORM, "END-PERFORM"}, + {TOKEN_DOT, "."}, + {TOKEN_STOP, "STOP"}, + {TOKEN_RUN, "RUN"}, + {TOKEN_DOT, "."}, + {TOKEN_EOF, ""}, + }; + yyin = fopen("samples/sorting-snippet.cbl", "r"); + ASSERT_TRUE(yyin); + int index = 0; + token_t t; + do { + printf("index: %d token: %d text: %s\n", index, t, yytext); + ASSERT_EQ(tokens[index].t, (t = yylex())); + ASSERT_STREQ(tokens[index].p, yytext); + ++index; + } while (t != TOKEN_EOF); } \ No newline at end of file diff --git a/lab-4/main_test.c b/lab-4/main_test.c index de1f347..29f238e 100644 --- a/lab-4/main_test.c +++ b/lab-4/main_test.c @@ -107,6 +107,32 @@ UTEST(parser, boolean) { yy_delete_buffer(buffer); + // Assert the result to test correctness + ASSERT_EQ(result, 0); +} + +UTEST(parser, looping) { + char string[] = "PERFORM VARYING I FROM 1 BY 1 UNTIL I > 10 MOVE I TO A(I)\0"; + YY_BUFFER_STATE buffer = yy_scan_buffer(string, sizeof(string)); + + yylineno = 1; + int result = yyparse(); + + yy_delete_buffer(buffer); + + // Assert the result to test correctness + ASSERT_EQ(result, 0); +} + +UTEST(parser, sorting) { + // Read sample file as input + yyin = fopen("samples/sorting-snippet.cbl", "r"); + yyrestart(yyin); + ASSERT_TRUE(yyin); + + yylineno = 1; + int result = yyparse(); + // Assert the result to test correctness ASSERT_EQ(result, 0); -} +}