// tests/suite/src/test_all.el — master entry point for the El comprehensive test suite.
//
// This is an El vessel. Build and run with:
//
//   cd tests/suite && elb && ./dist/el-tests
//
// Exit code equals the number of failing assertions (0 = all pass).

import "../../../runtime/string.el"
import "../../../runtime/math.el"
import "../../../runtime/state.el"
import "../../../runtime/fs.el"
import "../../../runtime/json.el"
import "../../../runtime/time.el"
import "../../../runtime/thread.el"
import "../../../runtime/test.el"
import "test_string.el"
import "test_math.el"
import "test_json.el"
import "test_state.el"
import "test_time.el"
import "test_fs.el"
import "test_collections.el"

fn main() -> Int {
    // ── string tests ───────────────────────────────────────────────────────────
    test_case("str_eq basic", "test_str_eq_basic")
    test_case("str_eq symbols", "test_str_eq_symbols")
    test_case("str_len basic", "test_str_len_basic")
    test_case("str_len longer", "test_str_len_longer")
    test_case("str_concat basic", "test_str_concat_basic")
    test_case("str_concat chaining", "test_str_concat_chaining")
    test_case("str_slice basic", "test_str_slice_basic")
    test_case("str_slice edge", "test_str_slice_edge")
    test_case("str_starts_with basic", "test_str_starts_with_basic")
    test_case("str_starts_with edge", "test_str_starts_with_edge")
    test_case("str_ends_with basic", "test_str_ends_with_basic")
    test_case("str_ends_with edge", "test_str_ends_with_edge")
    test_case("str_contains basic", "test_str_contains_basic")
    test_case("str_contains edge", "test_str_contains_edge")
    test_case("str_index_of basic", "test_str_index_of_basic")
    test_case("str_index_of duplicates", "test_str_index_of_duplicates")
    test_case("str_last_index_of basic", "test_str_last_index_of_basic")
    test_case("str_replace basic", "test_str_replace_basic")
    test_case("str_replace multiple", "test_str_replace_multiple")
    test_case("str_to_upper basic", "test_str_to_upper_basic")
    test_case("str_to_lower basic", "test_str_to_lower_basic")
    test_case("str_upper_lower roundtrip", "test_str_upper_lower_roundtrip")
    test_case("str_trim basic", "test_str_trim_basic")
    test_case("str_lstrip rstrip", "test_str_lstrip_rstrip")
    test_case("str_split basic", "test_str_split_basic")
    test_case("str_split edge", "test_str_split_edge")
    test_case("str_join basic", "test_str_join_basic")
    test_case("str_join edge", "test_str_join_edge")
    test_case("int_to_str basic", "test_int_to_str_basic")
    test_case("str_to_int basic", "test_str_to_int_basic")
    test_case("float_to_str basic", "test_float_to_str_basic")
    test_case("str_to_float basic", "test_str_to_float_basic")
    test_case("str_repeat basic", "test_str_repeat_basic")
    test_case("str_reverse basic", "test_str_reverse_basic")
    test_case("str_count basic", "test_str_count_basic")
    test_case("str_strip_prefix basic", "test_str_strip_prefix_basic")
    test_case("str_strip_suffix basic", "test_str_strip_suffix_basic")
    test_case("str_find_chars basic", "test_str_find_chars_basic")
    test_case("str_char_at basic", "test_str_char_at_basic")
    test_case("str_char_code basic", "test_str_char_code_basic")
    test_case("str_pad_left basic", "test_str_pad_left_basic")
    test_case("str_pad_right basic", "test_str_pad_right_basic")
    test_case("is_letter basic", "test_is_letter_basic")
    test_case("is_digit basic", "test_is_digit_basic")
    test_case("is_whitespace basic", "test_is_whitespace_basic")
    test_case("str_count_lines basic", "test_str_count_lines_basic")
    test_case("str_count_words basic", "test_str_count_words_basic")
    test_case("url_encode basic", "test_url_encode_basic")
    test_case("url roundtrip", "test_url_roundtrip")
    test_case("bool_to_str basic", "test_bool_to_str_basic")
    test_case("str_to_bytes basic", "test_str_to_bytes_basic")
    test_case("bytes roundtrip", "test_bytes_roundtrip")

    // ── math tests ─────────────────────────────────────────────────────────────
    test_case("el_abs basic", "test_el_abs_basic")
    test_case("el_max basic", "test_el_max_basic")
    test_case("el_max edge", "test_el_max_edge")
    test_case("el_min basic", "test_el_min_basic")
    test_case("el_min edge", "test_el_min_edge")
    test_case("math_sqrt basic", "test_math_sqrt_basic")
    test_case("math_sqrt larger", "test_math_sqrt_larger")
    test_case("math_log basic", "test_math_log_basic")
    test_case("math_ln basic", "test_math_ln_basic")
    test_case("math_pi basic", "test_math_pi_basic")
    test_case("math_sin basic", "test_math_sin_basic")
    test_case("math_cos basic", "test_math_cos_basic")
    // int_to_float, float_to_int, format_float, decimal_round omitted:
    // __int_to_float / __float_to_int / __format_float seed primitives are
    // not yet implemented in el_seed.c on the runtime/integrate branch.
    test_case("int arithmetic basic", "test_int_arithmetic_basic")
    test_case("int arithmetic edge", "test_int_arithmetic_edge")
    test_case("int arithmetic negative", "test_int_arithmetic_negative")
    test_case("float arithmetic basic", "test_float_arithmetic_basic")
    test_case("float comparison basic", "test_float_comparison_basic")

    // ── json tests ─────────────────────────────────────────────────────────────
    test_case("json_get basic", "test_json_get_basic")
    test_case("json_get types", "test_json_get_types")
    test_case("json_get nested", "test_json_get_nested")
    test_case("json_get empty", "test_json_get_empty")
    test_case("json_get_int basic", "test_json_get_int_basic")
    test_case("json_get_bool basic", "test_json_get_bool_basic")
    test_case("json_get_float basic", "test_json_get_float_basic")
    test_case("json_set basic", "test_json_set_basic")
    test_case("json_set numeric", "test_json_set_numeric")
    test_case("json_set chained", "test_json_set_chained")
    test_case("json_array_len basic", "test_json_array_len_basic")
    test_case("json_array_get basic", "test_json_array_get_basic")
    test_case("json_array_get numbers", "test_json_array_get_numbers")
    test_case("json_array_get objects", "test_json_array_get_objects")
    test_case("json_escape_string basic", "test_json_escape_string_basic")
    test_case("json_escape_string backslash", "test_json_escape_string_backslash")
    test_case("json_escape roundtrip", "test_json_escape_roundtrip")
    test_case("json_build_object basic", "test_json_build_object_basic")
    test_case("json_build_object empty", "test_json_build_object_empty")
    test_case("json_build_array basic", "test_json_build_array_basic")
    test_case("json_build_array empty", "test_json_build_array_empty")
    test_case("json_build_array numbers", "test_json_build_array_numbers")
    test_case("json_array_push basic", "test_json_array_push_basic")
    test_case("json_array_push preserves order", "test_json_array_push_preserves_order")
    test_case("json nested set get", "test_json_nested_set_get")
    test_case("json array of objects", "test_json_array_of_objects")

    // ── state tests ────────────────────────────────────────────────────────────
    test_case("state set get basic", "test_state_set_get_basic")
    test_case("state overwrite", "test_state_overwrite")
    test_case("state multiple keys", "test_state_multiple_keys")
    test_case("state missing key", "test_state_missing_key")
    test_case("state del basic", "test_state_del_basic")
    test_case("state del and reset", "test_state_del_and_reset")
    test_case("state has basic", "test_state_has_basic")
    test_case("state get_or basic", "test_state_get_or_basic")
    test_case("state cross function", "test_state_cross_function")
    test_case("state keys basic", "test_state_keys_basic")
    test_case("state value types", "test_state_value_types")

    // ── time tests ─────────────────────────────────────────────────────────────
    test_case("time_now basic", "test_time_now_basic")
    test_case("now_millis basic", "test_now_millis_basic")
    test_case("unix_timestamp_ms basic", "test_unix_timestamp_ms_basic")
    test_case("time_now_ms alias", "test_time_now_ms_alias")
    test_case("time monotonic now_millis", "test_time_monotonic_now_millis")
    test_case("time monotonic time_now", "test_time_monotonic_time_now")
    test_case("time monotonic now_ns", "test_time_monotonic_now_ns")
    test_case("unix_timestamp basic", "test_unix_timestamp_basic")
    test_case("time_to_parts basic", "test_time_to_parts_basic")
    test_case("time_to_parts epoch", "test_time_to_parts_epoch")
    test_case("time_to_parts current", "test_time_to_parts_current")
    test_case("time_format iso", "test_time_format_iso")
    test_case("time_format empty", "test_time_format_empty")
    test_case("time_format strftime", "test_time_format_strftime")
    test_case("time_add basic", "test_time_add_basic")
    test_case("time_add multiple", "test_time_add_multiple")
    test_case("time_diff basic", "test_time_diff_basic")
    test_case("time_diff larger", "test_time_diff_larger")
    test_case("time_diff zero", "test_time_diff_zero")
    test_case("duration helpers basic", "test_duration_helpers_basic")
    test_case("instant helpers basic", "test_instant_helpers_basic")
    test_case("uuid_new basic", "test_uuid_new_basic")
    test_case("uuid uniqueness", "test_uuid_uniqueness")
    test_case("time_from_parts basic", "test_time_from_parts_basic")
    test_case("instant_to_iso8601 basic", "test_instant_to_iso8601_basic")

    // ── filesystem tests ───────────────────────────────────────────────────────
    test_case("fs write read basic", "test_fs_write_read_basic")
    test_case("fs write read multiline", "test_fs_write_read_multiline")
    test_case("fs write read empty", "test_fs_write_read_empty")
    test_case("fs write overwrite", "test_fs_write_overwrite")
    test_case("fs write large content", "test_fs_write_large_content")
    test_case("fs exists basic", "test_fs_exists_basic")
    test_case("fs exists nonexistent", "test_fs_exists_nonexistent")
    test_case("fs write creates file", "test_fs_write_creates_file")
    test_case("fs read nonexistent", "test_fs_read_nonexistent")
    test_case("fs write json", "test_fs_write_json")
    test_case("fs write json array", "test_fs_write_json_array")
    test_case("fs multiple files", "test_fs_multiple_files")
    test_case("fs mkdir basic", "test_fs_mkdir_basic")
    test_case("fs mkdir write inside", "test_fs_mkdir_write_inside")
    test_case("fs special chars", "test_fs_special_chars")
    test_case("fs unicode content", "test_fs_unicode_content")

    // ── collection / list tests ────────────────────────────────────────────────
    test_case("list empty basic", "test_list_empty_basic")
    test_case("list empty multiple", "test_list_empty_multiple")
    test_case("list append single", "test_list_append_single")
    test_case("list append multiple", "test_list_append_multiple")
    test_case("list append order", "test_list_append_order")
    test_case("list append empty string", "test_list_append_empty_string")
    test_case("list len basic", "test_list_len_basic")
    test_case("list len large", "test_list_len_large")
    test_case("list get basic", "test_list_get_basic")
    test_case("list get preserves content", "test_list_get_preserves_content")
    test_case("list split join roundtrip", "test_list_split_join_roundtrip")
    test_case("list build and join", "test_list_build_and_join")
    test_case("list from split access", "test_list_from_split_access")
    test_case("native list empty basic", "test_native_list_empty_basic")
    test_case("native list append basic", "test_native_list_append_basic")
    test_case("native list join", "test_native_list_join")
    test_case("env list helpers", "test_env_list_helpers")
    test_case("list accumulate loop", "test_list_accumulate_loop")
    test_case("list string building", "test_list_string_building")

    return test_run_all()
}
