Added sls test cases
This commit is contained in:
parent
a6cfe15a29
commit
4c07271aaf
|
|
@ -0,0 +1,124 @@
|
|||
# Interpreter Test Runner
|
||||
|
||||
Requires `pip install pyyaml`
|
||||
|
||||
Test SLS (UNIX):
|
||||
`python3 test_runner.py ../../SLS_C/bin/sls tests.yaml`
|
||||
`python3 test_runner.py "python3 -m ../../SLS_Python/sls" tests.yaml`
|
||||
`python3 test_runner.py ../../SLS_Rust/target/debug/sls tests.yaml`
|
||||
|
||||
Test SLS (Windows):
|
||||
`python test_runner.py ..\..\SLS_C\bin\sls.exe tests.yaml`
|
||||
`python test_runner.py "python -m ..\..\SLS_Python\sls" tests.yaml`
|
||||
`python test_runner.py ..\..\SLS_Rust\target\debug\sls.exe tests.yaml`
|
||||
|
||||
Python Examples:
|
||||
`python test_runner.py python python_tests.yaml`
|
||||
`python test_runner.py pypy python_tests.yaml`
|
||||
|
||||
```
|
||||
>python test_runner.py python python_tests.yaml
|
||||
✓ PASS: Simple print statement
|
||||
|
||||
✓ PASS: Basic arithmetic
|
||||
|
||||
✓ PASS: Variable assignment and usage
|
||||
|
||||
✗ FAIL: Syntax error detection
|
||||
Reason: stderr mismatch
|
||||
Expected:
|
||||
SyntaxError: unterminated string literal (detected at line 1)
|
||||
|
||||
Got:
|
||||
File "<stdin>", line 1
|
||||
print("missing closing quote)
|
||||
^
|
||||
SyntaxError: unterminated string literal (detected at line 1)
|
||||
|
||||
|
||||
✓ PASS: Import and use module
|
||||
|
||||
✓ PASS: List operations
|
||||
|
||||
✓ PASS: Execute Python file with args
|
||||
|
||||
✓ PASS: Division by zero error
|
||||
|
||||
✗ FAIL: Check Python version (using args instead of stdin)
|
||||
Reason: stdout mismatch
|
||||
Expected:
|
||||
Python 3
|
||||
Got:
|
||||
Python 3.14.0
|
||||
|
||||
|
||||
✓ PASS: Multi-line function definition
|
||||
|
||||
✓ PASS: Long running operation with custom timeout
|
||||
|
||||
============================================================
|
||||
TEST SUMMARY
|
||||
============================================================
|
||||
Total tests: 11
|
||||
Passed: 9
|
||||
Failed: 2
|
||||
|
||||
Failed tests:
|
||||
- Syntax error detection
|
||||
- Check Python version (using args instead of stdin)
|
||||
============================================================
|
||||
```
|
||||
|
||||
```
|
||||
>python test_runner.py pypy python_tests.yaml
|
||||
✓ PASS: Simple print statement
|
||||
|
||||
✓ PASS: Basic arithmetic
|
||||
|
||||
✓ PASS: Variable assignment and usage
|
||||
|
||||
✗ FAIL: Syntax error detection
|
||||
Reason: stderr mismatch
|
||||
Expected:
|
||||
SyntaxError: unterminated string literal (detected at line 1)
|
||||
|
||||
Got:
|
||||
File "<stdin>", line 1
|
||||
print("missing closing quote)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
SyntaxError: unterminated string literal (detected at line 1)
|
||||
|
||||
|
||||
✓ PASS: Import and use module
|
||||
|
||||
✓ PASS: List operations
|
||||
|
||||
✓ PASS: Execute Python file with args
|
||||
|
||||
✓ PASS: Division by zero error
|
||||
|
||||
✗ FAIL: Check Python version (using args instead of stdin)
|
||||
Reason: stdout mismatch
|
||||
Expected:
|
||||
Python 3
|
||||
Got:
|
||||
Python 3.10.13 (f1607341da97ff5a1e93430b6e8c4af0ad1aa019, Sep 28 2023, 05:42:24)
|
||||
[PyPy 7.3.13 with MSC v.1929 64 bit (AMD64)]
|
||||
|
||||
|
||||
✓ PASS: Multi-line function definition
|
||||
|
||||
✓ PASS: Long running operation with custom timeout
|
||||
|
||||
============================================================
|
||||
TEST SUMMARY
|
||||
============================================================
|
||||
Total tests: 11
|
||||
Passed: 9
|
||||
Failed: 2
|
||||
|
||||
Failed tests:
|
||||
- Syntax error detection
|
||||
- Check Python version (using args instead of stdin)
|
||||
============================================================
|
||||
```
|
||||
|
|
@ -0,0 +1,706 @@
|
|||
tests:
|
||||
# Basic Stack Operations
|
||||
- name: "Simple value push"
|
||||
stdin: |
|
||||
42 print
|
||||
stdout: |
|
||||
42
|
||||
exit: success
|
||||
|
||||
- name: "Multiple values and operations"
|
||||
stdin: |
|
||||
3 4 + print
|
||||
10 5 - print
|
||||
stdout: |
|
||||
7
|
||||
5
|
||||
exit: success
|
||||
|
||||
- name: "Stack manipulation - dup"
|
||||
stdin: |
|
||||
5 dup print print
|
||||
stdout: |
|
||||
5
|
||||
5
|
||||
exit: success
|
||||
|
||||
- name: "Stack manipulation - swap"
|
||||
stdin: |
|
||||
10 20 swap print print
|
||||
stdout: |
|
||||
10
|
||||
20
|
||||
exit: success
|
||||
|
||||
- name: "Stack manipulation - over"
|
||||
stdin: |
|
||||
5 10 over print print print
|
||||
stdout: |
|
||||
5
|
||||
10
|
||||
5
|
||||
exit: success
|
||||
|
||||
- name: "Stack manipulation - rot"
|
||||
stdin: |
|
||||
1 2 3 rot print print print
|
||||
stdout: |
|
||||
1
|
||||
2
|
||||
3
|
||||
exit: success
|
||||
|
||||
- name: "Stack depth"
|
||||
stdin: |
|
||||
1 2 3 depth print
|
||||
stdout: |
|
||||
3
|
||||
exit: success
|
||||
|
||||
# Arithmetic Operations
|
||||
- name: "Basic arithmetic - all operators"
|
||||
stdin: |
|
||||
10 3 + print
|
||||
10 3 - print
|
||||
10 3 * print
|
||||
10 3 / print
|
||||
10 3 % print
|
||||
stdout: |
|
||||
13
|
||||
7
|
||||
30
|
||||
3
|
||||
1
|
||||
exit: success
|
||||
|
||||
- name: "Exponentiation"
|
||||
stdin: |
|
||||
2 8 ^ print
|
||||
3 3 ^ print
|
||||
stdout: |
|
||||
256
|
||||
27
|
||||
exit: success
|
||||
|
||||
- name: "Floating point arithmetic"
|
||||
stdin: |
|
||||
3.14 2.0 + print
|
||||
10.5 2.5 * print
|
||||
stdout: |
|
||||
5.14
|
||||
26.25
|
||||
exit: success
|
||||
|
||||
- name: "Mathematical functions"
|
||||
stdin: |
|
||||
16 sqrt print
|
||||
-42 abs print
|
||||
3.7 round print
|
||||
3.14 floor print
|
||||
3.14 ceil print
|
||||
stdout: |
|
||||
4.0
|
||||
42
|
||||
4.0
|
||||
3.0
|
||||
4.0
|
||||
exit: success
|
||||
|
||||
- name: "Min and max"
|
||||
stdin: |
|
||||
3 5 min print
|
||||
3 5 max print
|
||||
stdout: |
|
||||
3
|
||||
5
|
||||
exit: success
|
||||
|
||||
# Comparison Operations
|
||||
- name: "Comparison operators"
|
||||
stdin: |
|
||||
5 3 > print
|
||||
5 3 < print
|
||||
5 5 == print
|
||||
5 3 != print
|
||||
5 5 >= print
|
||||
3 5 <= print
|
||||
stdout: |
|
||||
true
|
||||
false
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
exit: success
|
||||
|
||||
# Logical Operations
|
||||
- name: "Logical operators"
|
||||
stdin: |
|
||||
true false and print
|
||||
true false or print
|
||||
false not print
|
||||
stdout: |
|
||||
false
|
||||
true
|
||||
true
|
||||
exit: success
|
||||
|
||||
# Bitwise Operations
|
||||
- name: "Bitwise operations"
|
||||
stdin: |
|
||||
0xFF 0x0F bitand print
|
||||
0xF0 0x0F bitor print
|
||||
0xFF 0x0F bitxor print
|
||||
4 2 shl print
|
||||
16 2 shr print
|
||||
stdout: |
|
||||
15
|
||||
255
|
||||
240
|
||||
16
|
||||
4
|
||||
exit: success
|
||||
|
||||
# String Operations
|
||||
- name: "String concatenation"
|
||||
stdin: |
|
||||
"hello" " world" concat print
|
||||
stdout: |
|
||||
hello world
|
||||
exit: success
|
||||
|
||||
- name: "String length and substring"
|
||||
stdin: |
|
||||
"hello" length print
|
||||
"hello" 1 3 substr print
|
||||
stdout: |
|
||||
5
|
||||
el
|
||||
exit: success
|
||||
|
||||
- name: "String split and join"
|
||||
stdin: |
|
||||
"a,b,c" "," split print
|
||||
stdout: |
|
||||
["a" "b" "c"]
|
||||
exit: success
|
||||
|
||||
- name: "String searching"
|
||||
stdin: |
|
||||
"hello" "hel" starts_with print
|
||||
"hello" "lo" ends_with print
|
||||
stdout: |
|
||||
true
|
||||
true
|
||||
exit: success
|
||||
|
||||
- name: "String trimming and replacement"
|
||||
stdin: |
|
||||
" hello " trim print
|
||||
"hello world" "world" "Stack" replace print
|
||||
stdout: |
|
||||
hello
|
||||
hello Stack
|
||||
exit: success
|
||||
|
||||
# Array Operations
|
||||
- name: "Array literals and access"
|
||||
stdin: |
|
||||
[1 2 3 4 5] print
|
||||
[1 2 3 4 5] 2 at print
|
||||
[1 2 3 4 5] length print
|
||||
stdout: |
|
||||
[1 2 3 4 5]
|
||||
3
|
||||
5
|
||||
exit: success
|
||||
|
||||
- name: "Array slice"
|
||||
stdin: |
|
||||
[10 20 30 40 50] 1 3 slice print
|
||||
stdout: |
|
||||
[20 30]
|
||||
exit: success
|
||||
|
||||
- name: "Array map"
|
||||
stdin: |
|
||||
[1 2 3 4] { 2 * } map print
|
||||
stdout: |
|
||||
[2 4 6 8]
|
||||
exit: success
|
||||
|
||||
- name: "Array filter"
|
||||
stdin: |
|
||||
[1 2 3 4 5] { 2 % 0 == } filter print
|
||||
stdout: |
|
||||
[2 4]
|
||||
exit: success
|
||||
|
||||
- name: "Array reduce"
|
||||
stdin: |
|
||||
[1 2 3 4] 0 { + } reduce print
|
||||
stdout: |
|
||||
10
|
||||
exit: success
|
||||
|
||||
- name: "Array sum and mean"
|
||||
stdin: |
|
||||
[1 2 3 4 5] sum print
|
||||
[1 2 3 4 5] mean print
|
||||
stdout: |
|
||||
15
|
||||
3.0
|
||||
exit: success
|
||||
|
||||
- name: "Array zip and enumerate"
|
||||
stdin: |
|
||||
[1 2 3] [4 5 6] zip print
|
||||
["a" "b" "c"] enumerate print
|
||||
stdout: |
|
||||
[[1 4] [2 5] [3 6]]
|
||||
[[0 "a"] [1 "b"] [2 "c"]]
|
||||
exit: success
|
||||
|
||||
- name: "Array reverse and transpose"
|
||||
stdin: |
|
||||
[1 2 3] reverse print
|
||||
[[1 2] [3 4]] transpose print
|
||||
stdout: |
|
||||
[3 2 1]
|
||||
[[1 3] [2 4]]
|
||||
exit: success
|
||||
|
||||
# Function Definition and Calling
|
||||
- name: "Simple function definition"
|
||||
stdin: |
|
||||
(Number -- Number) { dup * } ::square fn
|
||||
5 square print
|
||||
stdout: |
|
||||
25
|
||||
exit: success
|
||||
|
||||
- name: "Function with multiple operations"
|
||||
stdin: |
|
||||
(Number Number -- Number Number) {
|
||||
over over / swap %
|
||||
} ::divmod fn
|
||||
10 3 divmod print print
|
||||
stdout: |
|
||||
3
|
||||
1
|
||||
exit: success
|
||||
|
||||
- name: "Recursive factorial"
|
||||
stdin: |
|
||||
(Number -- Number) {
|
||||
dup 1 <=
|
||||
{ drop 1 }
|
||||
{ dup 1 - factorial * }
|
||||
if
|
||||
} ::factorial fn
|
||||
5 factorial print
|
||||
stdout: |
|
||||
120
|
||||
exit: success
|
||||
|
||||
# Control Flow - Conditionals
|
||||
- name: "Simple if statement"
|
||||
stdin: |
|
||||
5 0 > { "positive" print } { "negative" print } if
|
||||
stdout: |
|
||||
positive
|
||||
exit: success
|
||||
|
||||
- name: "If with else branch"
|
||||
stdin: |
|
||||
-3 0 > { "positive" print } { "non-positive" print } if
|
||||
stdout: |
|
||||
non-positive
|
||||
exit: success
|
||||
|
||||
- name: "Nested conditionals"
|
||||
stdin: |
|
||||
5 0 >
|
||||
{
|
||||
5 10
|
||||
{ "between 0 and 10" print }
|
||||
{ "greater than 10" print }
|
||||
if
|
||||
}
|
||||
{ "negative or zero" print }
|
||||
if
|
||||
stdout: |
|
||||
between 0 and 10
|
||||
exit: success
|
||||
|
||||
# Control Flow - Loops
|
||||
- name: "For loop"
|
||||
stdin: |
|
||||
1 5 { dup print } for
|
||||
stdout: |
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
exit: success
|
||||
|
||||
- name: "While loop"
|
||||
stdin: |
|
||||
0
|
||||
{ dup 3 < }
|
||||
{
|
||||
dup print
|
||||
1 +
|
||||
}
|
||||
while
|
||||
drop
|
||||
stdout: |
|
||||
0
|
||||
1
|
||||
2
|
||||
exit: success
|
||||
|
||||
- name: "Loop with break"
|
||||
stdin: |
|
||||
1 10 {
|
||||
dup 5 ==
|
||||
{ break }
|
||||
{ dup print }
|
||||
if
|
||||
} for
|
||||
stdout: |
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
exit: success
|
||||
|
||||
- name: "Loop with continue"
|
||||
stdin: |
|
||||
1 5 {
|
||||
dup 2 % 0 ==
|
||||
{ continue }
|
||||
{ dup print }
|
||||
if
|
||||
} for
|
||||
stdout: |
|
||||
1
|
||||
3
|
||||
5
|
||||
exit: success
|
||||
|
||||
# Structs
|
||||
- name: "Struct definition and creation"
|
||||
stdin: |
|
||||
(Number Number --) { x: y: } ::Point struct
|
||||
3.0 4.0 Point print
|
||||
stdout: |
|
||||
Point { x: 3.0, y: 4.0 }
|
||||
exit: success
|
||||
|
||||
- name: "Struct field access"
|
||||
stdin: |
|
||||
(Number Number --) { x: y: } ::Point struct
|
||||
3.0 4.0 Point
|
||||
dup ::x get print
|
||||
::y get print
|
||||
stdout: |
|
||||
3.0
|
||||
4.0
|
||||
exit: success
|
||||
|
||||
- name: "Struct field modification"
|
||||
stdin: |
|
||||
(Number Number --) { x: y: } ::Point struct
|
||||
3.0 4.0 Point
|
||||
10.0 ::x set
|
||||
::x get print
|
||||
stdout: |
|
||||
10.0
|
||||
exit: success
|
||||
|
||||
# Unions
|
||||
- name: "Union creation - Option type"
|
||||
stdin: |
|
||||
(T --) { Some(T) None } ::Option union
|
||||
42 Option::Some print
|
||||
Option::None print
|
||||
stdout: |
|
||||
Option::Some(42)
|
||||
Option::None
|
||||
exit: success
|
||||
|
||||
- name: "Pattern matching with Option"
|
||||
stdin: |
|
||||
(T --) { Some(T) None } ::Option union
|
||||
42 Option::Some {
|
||||
Some(x) => { x print }
|
||||
None => { "Nothing" print }
|
||||
} match
|
||||
stdout: |
|
||||
42
|
||||
exit: success
|
||||
|
||||
- name: "Result type pattern matching"
|
||||
stdin: |
|
||||
(T E --) { Ok(T) Err(E) } ::Result union
|
||||
"success" Result::Ok {
|
||||
Ok(val) => { val print }
|
||||
Err(e) => { "Error: " e concat print }
|
||||
} match
|
||||
stdout: |
|
||||
success
|
||||
exit: success
|
||||
|
||||
# Enums
|
||||
- name: "Enum definition and usage"
|
||||
stdin: |
|
||||
{ Pending: Active: Complete: } ::Status enum
|
||||
Status::Active print
|
||||
stdout: |
|
||||
Status::Active
|
||||
exit: success
|
||||
|
||||
# Traits
|
||||
- name: "Trait implementation for struct"
|
||||
stdin: |
|
||||
(Number Number --) { x: y: } ::Point struct
|
||||
::Addable {
|
||||
(Self Self -- Self) {
|
||||
over ::x get over ::x get +
|
||||
swap ::y get swap ::y get +
|
||||
Point
|
||||
} +:
|
||||
} ::Point impl
|
||||
1.0 2.0 Point 3.0 4.0 Point + print
|
||||
stdout: |
|
||||
Point { x: 4.0, y: 6.0 }
|
||||
exit: success
|
||||
|
||||
# Type Conversions
|
||||
- name: "Type conversions"
|
||||
stdin: |
|
||||
42 to_f64 print
|
||||
3.14 to_i32 print
|
||||
42 to_str print
|
||||
stdout: |
|
||||
42.0
|
||||
3
|
||||
"42"
|
||||
exit: success
|
||||
|
||||
- name: "String parsing"
|
||||
stdin: |
|
||||
"123" parse print
|
||||
stdout: |
|
||||
123
|
||||
exit: success
|
||||
|
||||
# Constants
|
||||
- name: "Constant definition and usage"
|
||||
stdin: |
|
||||
3.1415926535 ::pi const
|
||||
5 dup * pi * print
|
||||
stdout: |
|
||||
78.53981633975
|
||||
exit: success
|
||||
|
||||
# Lambda and Eval
|
||||
- name: "Lambda function"
|
||||
stdin: |
|
||||
{ dup * } lambda ::square swap
|
||||
5 square eval print
|
||||
stdout: |
|
||||
25
|
||||
exit: success
|
||||
|
||||
- name: "Eval operator"
|
||||
stdin: |
|
||||
"2 3 +" eval print
|
||||
stdout: |
|
||||
5
|
||||
exit: success
|
||||
|
||||
# Reflection
|
||||
- name: "Type checking with type_of"
|
||||
stdin: |
|
||||
42 type_of print
|
||||
"hello" type_of print
|
||||
stdout: |
|
||||
::i64
|
||||
::String
|
||||
exit: success
|
||||
|
||||
- name: "Trait checking with implements"
|
||||
stdin: |
|
||||
42 ::Addable implements print
|
||||
42 ::Drawable implements print
|
||||
stdout: |
|
||||
true
|
||||
false
|
||||
exit: success
|
||||
|
||||
# Assertions
|
||||
- name: "Passing assertion"
|
||||
stdin: |
|
||||
{ 2 3 + } { 5 == } assert
|
||||
"Test passed" print
|
||||
stdout: |
|
||||
Test passed
|
||||
exit: success
|
||||
|
||||
- name: "Failing assertion"
|
||||
stdin: |
|
||||
{ 2 3 + } { 6 == } assert
|
||||
stderr: |
|
||||
Assertion failed
|
||||
exit: error
|
||||
|
||||
# Randomness
|
||||
- name: "Random number generation with seed"
|
||||
stdin: |
|
||||
12345 seed
|
||||
rand 0.0 >= print
|
||||
rand 1.0 < print
|
||||
stdout: |
|
||||
true
|
||||
true
|
||||
exit: success
|
||||
|
||||
# Complex Examples
|
||||
- name: "FizzBuzz (1-15)"
|
||||
stdin: |
|
||||
(Number -- ) {
|
||||
dup 15 % 0 ==
|
||||
{ drop "FizzBuzz" print }
|
||||
{
|
||||
dup 3 % 0 ==
|
||||
{ drop "Fizz" print }
|
||||
{
|
||||
dup 5 % 0 ==
|
||||
{ drop "Buzz" print }
|
||||
{ print }
|
||||
if
|
||||
}
|
||||
if
|
||||
}
|
||||
if
|
||||
} ::fizzbuzz fn
|
||||
1 15 { fizzbuzz } for
|
||||
stdout: |
|
||||
1
|
||||
2
|
||||
Fizz
|
||||
4
|
||||
Buzz
|
||||
Fizz
|
||||
7
|
||||
8
|
||||
Fizz
|
||||
Buzz
|
||||
11
|
||||
Fizz
|
||||
13
|
||||
14
|
||||
FizzBuzz
|
||||
exit: success
|
||||
|
||||
- name: "Sum of squares of even numbers"
|
||||
stdin: |
|
||||
[1 2 3 4 5 6 7 8 9 10]
|
||||
{ 2 % 0 == } filter
|
||||
{ dup * } map
|
||||
0 { + } reduce
|
||||
print
|
||||
stdout: |
|
||||
220
|
||||
exit: success
|
||||
|
||||
# Error Cases
|
||||
- name: "Type mismatch error"
|
||||
stdin: |
|
||||
"hello" 5 +
|
||||
stderr: |
|
||||
Type error
|
||||
exit: error
|
||||
|
||||
- name: "Stack underflow"
|
||||
stdin: |
|
||||
+
|
||||
stderr: |
|
||||
Stack underflow
|
||||
exit: error
|
||||
|
||||
- name: "Undefined identifier"
|
||||
stdin: |
|
||||
undefined_function
|
||||
stderr: |
|
||||
Undefined identifier: undefined_function
|
||||
exit: error
|
||||
|
||||
- name: "Division by zero"
|
||||
stdin: |
|
||||
10 0 /
|
||||
stderr: |
|
||||
Division by zero
|
||||
exit: error
|
||||
|
||||
# Character Literals
|
||||
- name: "Character literals"
|
||||
stdin: |
|
||||
'A' print
|
||||
'\n' print
|
||||
'\u{1F600}' print
|
||||
stdout: |
|
||||
'A'
|
||||
'\n'
|
||||
'😀'
|
||||
exit: success
|
||||
|
||||
# Multiple test with timeout
|
||||
- name: "Complex computation with timeout"
|
||||
stdin: |
|
||||
1 100 { dup * } map 0 { + } reduce print
|
||||
stdout: |
|
||||
338350
|
||||
exit: success
|
||||
timeout: 2.0
|
||||
|
||||
# Comments
|
||||
- name: "Comments ignored"
|
||||
stdin: |
|
||||
// This is a comment
|
||||
5 // inline comment
|
||||
3 + // another comment
|
||||
print
|
||||
stdout: |
|
||||
8
|
||||
exit: success
|
||||
|
||||
# Array of structs
|
||||
- name: "Array of structs"
|
||||
stdin: |
|
||||
(Number Number --) { x: y: } ::Point struct
|
||||
[1 2 Point 3 4 Point] print
|
||||
stdout: |
|
||||
[Point { x: 1, y: 2 }, Point { x: 3, y: 4 }]
|
||||
exit: success
|
||||
|
||||
# Format strings
|
||||
- name: "String formatting"
|
||||
stdin: |
|
||||
"x=%d, y=%d" [5 10] format print
|
||||
stdout: |
|
||||
x=5, y=10
|
||||
exit: success
|
||||
|
||||
# Underscore separators in literals
|
||||
- name: "Underscore separators in numbers"
|
||||
stdin: |
|
||||
1_000_000 print
|
||||
3_1415.92_65 print
|
||||
stdout: |
|
||||
1000000
|
||||
3141.9265
|
||||
exit: success
|
||||
Loading…
Reference in New Issue