import "../../runtime/eltest.el"
// test_codegen_js.el - basic tests for JS codegen features.
//
// These tests verify that core El language features produce correct values
// when compiled and executed via the C backend. They serve as a
// regression baseline for the codegen pipeline.

test "arithmetic" {
    let x: Int = 2 + 3
    assert x == 5, "addition"
    let y: Int = 10 - 4
    assert y == 6, "subtraction"
    let z: Int = 3 * 4
    assert z == 12, "multiplication"
    let w: Int = 15 / 3
    assert w == 5, "division"
}

test "string-concat" {
    let a: String = "hello"
    let b: String = " world"
    let c: String = a + b
    assert c == "hello world", "string concatenation"
}

test "str-len" {
    let n: Int = str_len("hello")
    assert n == 5, "str_len hello"
    let m: Int = str_len("")
    assert m == 0, "str_len empty"
}

test "bool-logic" {
    let t = true
    let f = false
    assert t, "true is truthy"
    assert !f, "false negated is truthy"
    assert t && !f, "true and not false"
    assert t || f, "true or false"
}

test "list-operations" {
    let lst: [Int] = native_list_empty()
    let lst = native_list_append(lst, 10)
    let lst = native_list_append(lst, 20)
    let lst = native_list_append(lst, 30)
    let n: Int = native_list_len(lst)
    assert n == 3, "list length 3"
    let v0: Int = native_list_get(lst, 0)
    let v1: Int = native_list_get(lst, 1)
    let v2: Int = native_list_get(lst, 2)
    assert v0 == 10, "first element"
    assert v1 == 20, "second element"
    assert v2 == 30, "third element"
}

test "str-slice" {
    let s: String = str_slice("hello world", 6, 11)
    assert s == "world", "slice from 6 to 11"
}

test "str-contains" {
    assert str_contains("hello world", "world"), "contains world"
    assert !str_contains("hello world", "xyz"), "does not contain xyz"
}

test "int-to-str" {
    let s: String = int_to_str(42)
    assert s == "42", "int to string"
}

test "str-to-int" {
    let n: Int = str_to_int("123")
    assert n == 123, "string to int"
}

test "str-starts-ends" {
    assert str_starts_with("hello world", "hello"), "starts with hello"
    assert str_ends_with("hello world", "world"), "ends with world"
    assert !str_starts_with("hello world", "world"), "does not start with world"
}
