feat: implement Schema module for versioned types
Add Schema module with functions for creating and migrating versioned values. This provides the runtime foundation for schema evolution. Schema module functions: - Schema.versioned(typeName, version, value) - create versioned value - Schema.migrate(value, targetVersion) - migrate to new version - Schema.getVersion(value) - get version number Changes: - Add Versioned, Migrate, GetVersion builtins to interpreter - Add Schema module to global environment - Add Schema module type to type environment - Add 4 tests for schema operations - Add examples/versioning.lux demonstrating usage Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
44
src/main.rs
44
src/main.rs
@@ -1333,6 +1333,50 @@ c")"#;
|
||||
assert!(err_msg.contains("outside") || err_msg.contains("Resume"),
|
||||
"Error should mention resume outside handler: {}", err_msg);
|
||||
}
|
||||
|
||||
// Schema Evolution tests
|
||||
#[test]
|
||||
fn test_schema_versioned() {
|
||||
let source = r#"
|
||||
let user = Schema.versioned("User", 1, { name: "Alice", age: 30 })
|
||||
let version = Schema.getVersion(user)
|
||||
"#;
|
||||
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
|
||||
assert_eq!(result, "1");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_schema_migrate_same_version() {
|
||||
let source = r#"
|
||||
let user = Schema.versioned("User", 2, { name: "Bob" })
|
||||
let migrated = Schema.migrate(user, 2)
|
||||
let version = Schema.getVersion(migrated)
|
||||
"#;
|
||||
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
|
||||
assert_eq!(result, "2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_schema_migrate_upgrade() {
|
||||
let source = r#"
|
||||
let user = Schema.versioned("User", 1, { name: "Charlie" })
|
||||
let migrated = Schema.migrate(user, 3)
|
||||
let version = Schema.getVersion(migrated)
|
||||
"#;
|
||||
let (result, _) = run_with_effects(source, Value::Unit, Value::Unit).unwrap();
|
||||
assert_eq!(result, "3");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_schema_migrate_downgrade_fails() {
|
||||
let source = r#"
|
||||
let user = Schema.versioned("User", 3, { name: "Dave" })
|
||||
let migrated = Schema.migrate(user, 1)
|
||||
"#;
|
||||
let result = run_with_effects(source, Value::Unit, Value::Unit);
|
||||
assert!(result.is_err());
|
||||
assert!(result.unwrap_err().contains("downgrade"));
|
||||
}
|
||||
}
|
||||
|
||||
// Diagnostic rendering tests
|
||||
|
||||
Reference in New Issue
Block a user