From d6bee8b2e2f5a54a09cdc9bc152dfe9e1a2de487 Mon Sep 17 00:00:00 2001 From: Grant Horner Date: Sun, 10 May 2026 08:47:25 -0400 Subject: [PATCH] fix end of file bug --- .gitignore | 3 ++- edit.jai | 23 ++++++++++++++--- test.jai | 73 +++++++++++++++++++++++++++++++----------------------- 3 files changed, 63 insertions(+), 36 deletions(-) diff --git a/.gitignore b/.gitignore index 53f7aec..01ae68c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ edit *.ttf .build main -test \ No newline at end of file +test +*.dSYM \ No newline at end of file diff --git a/edit.jai b/edit.jai index ad7d533..35afdac 100644 --- a/edit.jai +++ b/edit.jai @@ -52,6 +52,9 @@ run_editor :: (file_name: string) { state.file_name = file_name; window := create_window(state.window_width, state.window_height, state.file_name); + state.window_width, state.window_height = Simp.get_render_dimensions(window); + + my_init_fonts(*state); Simp.set_render_target(window); @@ -257,9 +260,13 @@ handle_arrow :: (using state: *State, using event: Input.Event) { cursor_y -= 1; } case .ARROW_DOWN; - if cursor_y == visible_lines.count - 1 { + if cursor_y + first_line == lines.count - 1 { + print("End of file?\n"); + print_vars(cursor_y, first_line, visible_lines.count, lines.count); + } else if cursor_y == visible_lines.count - 1 { + print("increasing first line\n"); + print_vars(cursor_y, visible_lines.count); first_line = min(first_line + 1, lines.count); - } else if cursor_y + first_line + visible_lines.count >= lines.count { } else { cursor_y += 1; } @@ -290,6 +297,9 @@ handle_arrow :: (using state: *State, using event: Input.Event) { get_visible_lines :: (using state: State) -> [][..]u8 { if line_height <= 1 || window_height == 0 return .[]; num_lines_in_screen := window_height / line_height - 1; + print("num_lines_in_screen: %\n", num_lines_in_screen); + print("first_line: %\n", first_line); + print("lines: %\n", lines); return array_view(lines, first_line, num_lines_in_screen); } @@ -370,10 +380,15 @@ read_file_lines :: (using state: *State, file_path: string) -> bool { } my_init_fonts :: (using state: *State) { - line_height = 16; base_path := path_strip_filename(get_path_of_running_executable()); - my_font = Simp.get_font_at_size("/home/grant/.local/share/fonts/otf/BerkeleyMono/", "BerkeleyMono-Regular.otf", line_height); + #if OS == .LINUX { + line_height = 16; + my_font = Simp.get_font_at_size("/home/grant/.local/share/fonts/otf/BerkeleyMono/", "BerkeleyMono-Regular.otf", line_height); + } else if OS == .MACOS { + line_height = 32; + my_font = Simp.get_font_at_size("/Users/grant/Library/Fonts/", "BerkeleyMono-Regular.otf", line_height); + } // my_font = Simp.get_font_at_size(base_path, "Anonymous Pro.ttf", line_height); assert(my_font != null); } diff --git a/test.jai b/test.jai index 6c2a0d5..6340116 100644 --- a/test.jai +++ b/test.jai @@ -1,10 +1,22 @@ main :: () { print("\nBeginning tests...\n"); - // test_handle_arrow_empty_lines(); - // test_handle_arrow_one_line(); - x := 1; - y := 2; - assert_test(x == y); + //test_get_visible_lines(); + //test_handle_arrow_empty_lines(); + test_handle_arrow_one_line(); + print("Tests completed successfully\n"); +} + +test_get_visible_lines :: () { + state: State; + state.line_height = 10; + state.window_height = 100; + assert_test(get_visible_lines(state).count == 0); + + line: [..]u8; + array_add(*line, array_view("foo")); + array_add(*state.lines, line); + assert_test(get_visible_lines(state).count == 1); + print("test_get_visible_lines completed successfully\n"); } test_handle_arrow_empty_lines :: () { @@ -23,14 +35,13 @@ test_handle_arrow_empty_lines :: () { test_handle_arrow_one_line :: () { state: State; + state.first_line = 0; state.cursor_y = 0; state.cursor_x = 0; + state.line_height = 10; + state.window_height = 100; - line: [..]u8; - line_str := "foo bar"; - - array_add(*line, .{data=line_str.data, count=line_str.count}); - array_add(*state.lines, line); + add_line(*state, "foo bar"); codes := Input.Key_Code.[.ARROW_DOWN, .ARROW_UP, .ARROW_LEFT]; for codes { @@ -38,33 +49,33 @@ test_handle_arrow_one_line :: () { assert(state.cursor_x == 0 && state.cursor_y == 0); } - handle_arrow(*state, .{key_code=.ARROW_RIGHT}); - assert(state.cursor_x == 1 && state.cursor_y == 0); + + print("lines: %\n", state.lines); + print("visible_lines: %\n", get_visible_lines(state)); + handle_arrow(*state, .ARROW_RIGHT); + assert_test(state.cursor_x == 1 && state.cursor_y == 0); print("test_handle_arrow_one_line completed successfully\n"); } -assert_test :: (value: bool, $code := #caller_code) { - builder: String_Builder; - root, expressions := compiler_get_nodes(code); - loc := #location(code); +assert_test :: (value: bool, $call := #caller_code, loc := #caller_location) { + if value == true return; + assert(false, "%\nValue is false.", #run get_expression(call), value, loc = loc); +} - print_to_builder(*builder, "%:%: Test: ", loc.fully_pathed_filename, loc.line_number); +get_expression :: (call := #caller_code) -> string { + root := compiler_get_nodes(call); + builder: String_Builder; print_expression(*builder, root); - append(*builder, "\n"); - `result := #insert code; - if !result { - for expressions { - if it == root continue; - print_expression(*builder, it); - append(*builder, "\n"); - } - append(*builder, "\n"); - `expression := builder_to_string(*builder); - `print("%\n", expression); - } else { - `print("Passed!\n"); - } + return builder_to_string(*builder); +}; + +#scope_file + +add_line :: (using state: *State, line: string) { + line_dyn: [..]u8; + array_add(*line_dyn, array_view(line)); + array_add(*state.lines, line_dyn); } #import,file "edit.jai";