lumen-compiler 0.1.1

The AI-Native Programming Language
Documentation
use std::fs;
use std::path::PathBuf;

use lumen_compiler::{compile_raw_with_imports, compile_with_imports};

fn std_testing_module_source() -> String {
    let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
    let testing_path = manifest_dir.join("../../stdlib/std/testing.lm.md");
    fs::read_to_string(&testing_path)
        .unwrap_or_else(|e| panic!("cannot read {}: {}", testing_path.display(), e))
}

fn resolver(module: &str, testing_source: &str) -> Option<String> {
    if module == "std.testing" {
        Some(testing_source.to_string())
    } else {
        None
    }
}

#[test]
fn testing_helpers_compile_in_markdown_program() {
    let testing_source = std_testing_module_source();
    let source = r#"
# testing-import-md

```lumen
import std.testing: create_test_suite, add_test, assert_eq, assert_true, assert_contains, assert_not_contains, assert_length, summarize_tests, all_passed

cell main() -> Bool
  let tests = create_test_suite()
  tests = add_test(tests, assert_eq(2 + 2, 4, "2 + 2 == 4"))
  tests = add_test(tests, assert_true(3 < 5, "3 < 5"))
  tests = add_test(tests, assert_contains([1, 2, 3], 2, "contains list value"))
  tests = add_test(tests, assert_not_contains([1, 2, 3], 9, "value is absent"))
  tests = add_test(tests, assert_length([10, 20, 30], 3, "list length is 3"))
  let summary = summarize_tests(tests)
  return all_passed(tests) and summary.all_passed
end
```
"#;

    let module = compile_with_imports(source, &|module| resolver(module, &testing_source))
        .expect("markdown program should compile with std.testing imports");

    assert!(
        module.cells.iter().any(|c| c.name == "main"),
        "expected main cell in compiled module"
    );
    assert!(
        module.cells.iter().any(|c| c.name == "assert_not_contains"),
        "expected imported std.testing helper cells in compiled module"
    );
}

#[test]
fn testing_helpers_compile_in_raw_program() {
    let testing_source = std_testing_module_source();
    let source = r#"
import std.testing: create_test_suite, add_test, assert_false, assert_not_empty, assert_empty, summarize_tests

cell main() -> Bool
  let tests = create_test_suite()
  tests = add_test(tests, assert_false(false, "false is false"))
  tests = add_test(tests, assert_not_empty([1], "list is not empty"))
  tests = add_test(tests, assert_empty([], "empty list is empty"))
  let summary = summarize_tests(tests)
  return summary.all_passed and summary.failed == 0
end
"#;

    let module = compile_raw_with_imports(source, &|module| resolver(module, &testing_source))
        .expect("raw program should compile with std.testing imports");

    assert!(
        module.cells.iter().any(|c| c.name == "main"),
        "expected main cell in compiled module"
    );
    assert!(
        module.cells.iter().any(|c| c.name == "summarize_tests"),
        "expected imported summary helpers in compiled module"
    );
}