mirror of
https://github.com/johndoe6345789/metabuilder.git
synced 2026-04-25 22:34:56 +00:00
219 lines
5.3 KiB
Markdown
219 lines
5.3 KiB
Markdown
# JSON Script Testing Guide
|
|
|
|
Two testing approaches are supported for JSON scripts:
|
|
|
|
## 1. Simple Tests (`*.cases.json`)
|
|
|
|
Test functions from `script.json` with expected outputs.
|
|
|
|
**Structure**:
|
|
- `script.json` - Contains the functions to test
|
|
- `*.cases.json` - Contains test cases with inputs and expected outputs
|
|
|
|
**Example**:
|
|
```bash
|
|
node test_cli.cjs script.json expressions.cases.json
|
|
```
|
|
|
|
## 2. Parameterized Tests (`.test.logic.json` + `.test.parameters.json`)
|
|
|
|
Define test logic once, run with many parameter sets.
|
|
|
|
**Structure**:
|
|
- `*.test.logic.json` - Test assertion functions (the test code)
|
|
- `*.test.parameters.json` - Input datasets to test with
|
|
|
|
### Files
|
|
|
|
#### `math.test.logic.json` - Test Logic
|
|
|
|
Contains test functions that perform assertions:
|
|
|
|
```json
|
|
{
|
|
"functions": [{
|
|
"name": "test_add",
|
|
"params": [{"name": "testCase", "type": "object"}],
|
|
"body": [
|
|
{
|
|
"type": "const_declaration",
|
|
"name": "actual",
|
|
"value": {
|
|
"type": "binary_expression",
|
|
"left": {"type": "member_access", "object": "$ref:params.testCase", "property": "a"},
|
|
"operator": "+",
|
|
"right": {"type": "member_access", "object": "$ref:params.testCase", "property": "b"}
|
|
}
|
|
},
|
|
{
|
|
"type": "return",
|
|
"value": {
|
|
"type": "object_literal",
|
|
"properties": {
|
|
"passed": {
|
|
"type": "binary_expression",
|
|
"left": "$ref:local.actual",
|
|
"operator": "==",
|
|
"right": {"type": "member_access", "object": "$ref:params.testCase", "property": "expected"}
|
|
},
|
|
"actual": "$ref:local.actual"
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}]
|
|
}
|
|
```
|
|
|
|
#### `math.test.parameters.json` - Test Data
|
|
|
|
Contains test cases organized by function and category:
|
|
|
|
```json
|
|
{
|
|
"test_add": {
|
|
"positive_numbers": [
|
|
{
|
|
"desc": "Adding two positive numbers",
|
|
"input": {"a": 5, "b": 3, "expected": 8}
|
|
},
|
|
{
|
|
"desc": "Adding zero",
|
|
"input": {"a": 10, "b": 0, "expected": 10}
|
|
}
|
|
],
|
|
"edge_cases": [
|
|
{
|
|
"desc": "Both zero",
|
|
"input": {"a": 0, "b": 0, "expected": 0}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
### Running Parameterized Tests
|
|
|
|
```bash
|
|
node test_parameterized_cli.cjs \
|
|
math.test.logic.json \
|
|
math.test.parameters.json
|
|
```
|
|
|
|
### Output
|
|
|
|
```
|
|
============================================================
|
|
Parameterized Test Results
|
|
============================================================
|
|
|
|
📦 Function: test_add
|
|
8/8 tests passed
|
|
|
|
✅ positive_numbers (3/3)
|
|
✓ Adding two positive numbers (1ms)
|
|
✓ Adding zero (0ms)
|
|
✓ Large numbers (0ms)
|
|
|
|
✅ edge_cases (2/2)
|
|
✓ Both zero (0ms)
|
|
✓ Very large numbers (0ms)
|
|
|
|
============================================================
|
|
Overall: 13/13 tests passed (0 failed)
|
|
🎉 All parameterized tests passed!
|
|
```
|
|
|
|
## Test Function Return Format
|
|
|
|
Test logic functions should return:
|
|
|
|
```json
|
|
{
|
|
"passed": true, // boolean - did the test pass?
|
|
"actual": 8, // any - actual result
|
|
"expected": 8 // any - expected result (optional)
|
|
}
|
|
```
|
|
|
|
## Examples in This Directory
|
|
|
|
### Simple Tests
|
|
- `expressions.cases.json` - Tests for all expression types
|
|
- `statements.cases.json` - Tests for all statement types
|
|
|
|
### Parameterized Tests
|
|
- `math.test.logic.json` + `math.test.parameters.json` - Math operation tests
|
|
|
|
## Benefits of Parameterized Tests
|
|
|
|
### ✅ DRY (Don't Repeat Yourself)
|
|
Write test logic once, reuse with many inputs
|
|
|
|
### ✅ Easy to Add Cases
|
|
Just add entries to `test.parameters.json`, no code changes needed
|
|
|
|
### ✅ Organized by Category
|
|
Group related test cases (positive_numbers, edge_cases, etc.)
|
|
|
|
### ✅ Clear Separation
|
|
- Logic (assertions) in one file
|
|
- Data (test cases) in another
|
|
|
|
### ✅ Maintainable
|
|
Update test logic in one place, affects all test cases
|
|
|
|
## When to Use Each Approach
|
|
|
|
### Use Simple Tests When:
|
|
- Testing existing functions from `script.json`
|
|
- Quick smoke tests
|
|
- One-off test cases
|
|
- Testing the JSON executor itself
|
|
|
|
### Use Parameterized Tests When:
|
|
- Many similar test cases with different inputs
|
|
- Complex validation logic
|
|
- Form validation (valid/invalid cases)
|
|
- Edge case testing
|
|
- Regression test suites
|
|
|
|
## Creating New Parameterized Tests
|
|
|
|
1. Create `yourtest.test.logic.json` with test functions:
|
|
```json
|
|
{
|
|
"functions": [{
|
|
"name": "test_myfunction",
|
|
"params": [{"name": "testCase"}],
|
|
"body": [
|
|
{"type": "return", "value": {"passed": true}}
|
|
]
|
|
}]
|
|
}
|
|
```
|
|
|
|
2. Create `yourtest.test.parameters.json` with test data:
|
|
```json
|
|
{
|
|
"test_myfunction": {
|
|
"category1": [
|
|
{"desc": "Test case 1", "input": {...}}
|
|
]
|
|
}
|
|
}
|
|
```
|
|
|
|
3. Run the tests:
|
|
```bash
|
|
node test_parameterized_cli.cjs \
|
|
yourtest.test.logic.json \
|
|
yourtest.test.parameters.json
|
|
```
|
|
|
|
## See Also
|
|
|
|
- [JSON Script Runtime README](../../../shared/seed/scripts/runtime/README.md)
|
|
- [JSON Script Specification](../../../shared/seed/SCRIPT_JSON_SPEC_ISSUES.md)
|
|
- [json_script_example Package](../README.md)
|