Skip to content

Commit

Permalink
- minor bug and implementation fixes in 'for' loop visit method
Browse files Browse the repository at this point in the history
- lexer errors and interpreter errors unit tests
- removed redundant parser testcases
  • Loading branch information
SageTendo committed Jan 7, 2024
1 parent 9b45df0 commit 5ba978e
Show file tree
Hide file tree
Showing 43 changed files with 88 additions and 307 deletions.
19 changes: 9 additions & 10 deletions src/Interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,12 +230,13 @@ def validate_range_node(range_node):
@return int: The validated range value.
@raise InterpreterError: If the range value is not an integer.
"""
try:
runtime_object = range_node.accept(self)
return int(runtime_object.value)
except ValueError:
raise InterpreterError(ErrorType.RUNTIME, "Range value must be integers",
runtime_object = range_node.accept(self)
if type(runtime_object.value) is not int:
raise InterpreterError(ErrorType.RUNTIME,
f"Range value '{type(runtime_object.value).__name__}' "
f"cannot be used as an integer",
range_node.start_pos, range_node.end_pos)
return runtime_object.value

range_start = validate_range_node(node.range_start)
range_end = validate_range_node(node.range_end)
Expand Down Expand Up @@ -487,12 +488,10 @@ def visit_factor(self, node: 'FactorNode'):
return RunTimeObject("boolean", not right_factor.value)

elif left_factor.value == '-':
if right_factor.label == "number":
try:
return RunTimeObject("number", -right_factor.value)

raise InterpreterError(ErrorType.TYPE,
f"Value '{right_factor.value}' of variable is not a numeric type",
self.node_start_pos, self.node_end_pos)
except TypeError as e:
raise InterpreterError(ErrorType.TYPE, e.args[0], self.node_start_pos, self.node_end_pos)
return left_factor

@staticmethod
Expand Down
3 changes: 0 additions & 3 deletions src/Parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -230,9 +230,6 @@ def parse_statement(self):
statement_node = self.parse_print()
elif self.match(TokenType.INPUT):
statement_node = self.parse_input()
else:
raise ParserError("Unexpected token: " + self.curr_tkn.value,
self.curr_tkn.line_num, self.curr_tkn.column_num)

statement_node.start_pos = start_pos
statement_node.end_pos = self.curr_tkn.pos
Expand Down
68 changes: 65 additions & 3 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ def setUp(self):
self.lexer = Lexer()
self.parser = Parser()
self.interpreter = Interpreter()
self.num_random_tests = 50000
self.num_random_tests = 25000

def tearDown(self):
self.lexer = None
Expand Down Expand Up @@ -48,12 +48,47 @@ def test_lexer(self):
print(e, file=sys.stderr)
self.fail()

def test_lexer_errors(self):
header = "Testing Lexer Errors"
print(header)
print(f"-" * len(header))

test_dir = os.path.join(self.test_dir, "errors/lexer/")
for file in os.listdir(test_dir):
if not file.endswith(".lex"):
continue

output_file = file.replace(".lex", ".out")
with open(os.path.join(test_dir, output_file)) as f:
expected = f.read()

print(f"[Lexer Error] Running test on: {file}")
try:
self.lexer.analyze_src_file(test_dir + file)

token = Token()
while token.type != TokenType.ENDMARKER:
token = self.lexer.get_token()
print(" ", token)

self.fail()
except Exception as e:
if expected.lower() not in str(e).lower():
print(expected in str(e))
print(e)
self.fail(f"EXPECTED:\n"
f" {expected}\n"
f"ACTUAL:\n"
f" {e}")
finally:
self.lexer.__init__()

def test_parser(self):
header = "Testing Parser"
print(header)
print(f"-" * len(header))

test_dir = os.path.join(self.test_dir, "parser/")
test_dir = os.path.join(self.test_dir, "interpreter/in/")
for file in os.listdir(test_dir):
print(f"[Parser] Running test on: {file}")

Expand Down Expand Up @@ -112,6 +147,33 @@ def test_interpreter(self):
if failed:
self.fail()

def test_interpreter_errors(self):
header = "Testing Interpreter Errors"
print(header)
print(f"-" * len(header))

test_dir = os.path.join(self.test_dir, "errors/interpreter/")
for file in os.listdir(test_dir):
if not file.endswith(".ny"):
continue

output_file = file.replace(".ny", ".out")
with open(os.path.join(test_dir, output_file)) as f:
expected = f.read()

proc = subprocess.run(
["python3", "nyaa.py", test_dir + file],
capture_output=True,
text=True
)

print(f"[Interpreter Error] Running test on: {file}")
if expected.lower().strip() not in str(proc.stderr).lower().strip():
self.fail(f"EXPECTED:\n"
f" {expected}\n"
f"ACTUAL:\n"
f" {proc.stderr}")

def test_operator_precedence_expressions(self):
header = "Testing Operator Precedence Expressions"
print(header)
Expand Down Expand Up @@ -167,7 +229,7 @@ def test_prioritized_expressions(self):

start = -sys.maxsize - 1
end = sys.maxsize
for _ in range(self.num_random_tests // 10):
for _ in range(self.num_random_tests // 2):
a = random.randint(start, end)
b = random.randint(start, end)
c = random.randint(start, end)
Expand Down
1 change: 1 addition & 0 deletions tests/errors/lexer/identifier_too_long.lex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
eiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouv
1 change: 1 addition & 0 deletions tests/errors/lexer/identifier_too_long.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Identifier exceeds the maximum length
1 change: 1 addition & 0 deletions tests/errors/lexer/invalid_escape_char.lex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"\0"
1 change: 1 addition & 0 deletions tests/errors/lexer/invalid_escape_char.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Invalid escape character
1 change: 1 addition & 0 deletions tests/errors/lexer/string_too_long.lex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"eiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouveiohfoiefhioehfiofheiohfwegvbvjbveuirbevoiubfvouv"
1 change: 1 addition & 0 deletions tests/errors/lexer/string_too_long.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
String too long
1 change: 1 addition & 0 deletions tests/errors/lexer/unrecognized_char.lex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/?\@^\|
1 change: 1 addition & 0 deletions tests/errors/lexer/unrecognized_char.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Unrecognized character
1 change: 1 addition & 0 deletions tests/errors/lexer/unterminated_string.lex
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"dfkfgoiggghmgh
1 change: 1 addition & 0 deletions tests/errors/lexer/unterminated_string.out
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Unterminated string
7 changes: 4 additions & 3 deletions tests/interpreter/in/for.ny
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,18 @@ uWu_nyaa() => {
}
yomu()

for i => (1 supuritto 1, 10) {
a wa 10
for i => (1, a) {
yomu(i)
}
yomu()

for i => (IIE, HAI) {
for i => (0, 1) {
yomu(i)
}
yomu()

for _ => (HAI, IIE) {
for _ => (1, 0) {
yomu(_)
}
yomu(_)
Expand Down
13 changes: 0 additions & 13 deletions tests/parser/1toN.ny

This file was deleted.

1 change: 0 additions & 1 deletion tests/parser/OneLineMain.ny

This file was deleted.

2 changes: 0 additions & 2 deletions tests/parser/add.ny

This file was deleted.

5 changes: 0 additions & 5 deletions tests/parser/assign_and_use.ny

This file was deleted.

3 changes: 0 additions & 3 deletions tests/parser/assignment.ny

This file was deleted.

13 changes: 0 additions & 13 deletions tests/parser/complex_expr.ny

This file was deleted.

3 changes: 0 additions & 3 deletions tests/parser/div-err.ny

This file was deleted.

2 changes: 0 additions & 2 deletions tests/parser/div.ny

This file was deleted.

1 change: 0 additions & 1 deletion tests/parser/eof.ny

This file was deleted.

16 changes: 0 additions & 16 deletions tests/parser/factorial.ny

This file was deleted.

10 changes: 0 additions & 10 deletions tests/parser/fib.ny

This file was deleted.

4 changes: 0 additions & 4 deletions tests/parser/float_add.ny

This file was deleted.

42 changes: 0 additions & 42 deletions tests/parser/for.ny

This file was deleted.

8 changes: 0 additions & 8 deletions tests/parser/func.ny

This file was deleted.

9 changes: 0 additions & 9 deletions tests/parser/func2.ny

This file was deleted.

3 changes: 0 additions & 3 deletions tests/parser/hello.ny

This file was deleted.

9 changes: 0 additions & 9 deletions tests/parser/if-elif-else.ny

This file was deleted.

8 changes: 0 additions & 8 deletions tests/parser/if-elif.ny

This file was deleted.

13 changes: 0 additions & 13 deletions tests/parser/if-else.ny

This file was deleted.

Loading

0 comments on commit 5ba978e

Please sign in to comment.