about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-03-26 09:36:41 -0700
committerKartik K. Agaram <vc@akkartik.com>2023-03-26 09:36:41 -0700
commiteae5c9505c665b343af7690d9665431ae17ed5e9 (patch)
tree046b87f9af87ff6510e3fed2076032593a36dd24
parent0ae94b0de59618bb86a55edcaa8e961abb192f2d (diff)
downloadlines.love-eae5c9505c665b343af7690d9665431ae17ed5e9.tar.gz
bugfix: naming points
-rw-r--r--app.lua4
-rw-r--r--drawing_tests.lua35
-rw-r--r--edit.lua9
-rw-r--r--text.lua1
4 files changed, 44 insertions, 5 deletions
diff --git a/app.lua b/app.lua
index 30fc696..59dff31 100644
--- a/app.lua
+++ b/app.lua
@@ -369,6 +369,7 @@ function App.run_tests()
   table.sort(sorted_names)
   for _,name in ipairs(sorted_names) do
     App.initialize_for_test()
+--?     print('=== '..name)
     xpcall(_G[name], function(err) prepend_debug_info_to_test_failure(name, err) end)
   end
   -- clean up all test methods
@@ -380,9 +381,10 @@ end
 -- prepend file/line/test
 function prepend_debug_info_to_test_failure(test_name, err)
   local err_without_line_number = err:gsub('^[^:]*:[^:]*: ', '')
-  local stack_trace = debug.traceback('', --[[stack frame]]5)
+  local stack_trace = debug.traceback('', --[[stack frame]]4)
   local file_and_line_number = stack_trace:gsub('stack traceback:\n', ''):gsub(': .*', '')
   local full_error = file_and_line_number..':'..test_name..' -- '..err_without_line_number
+--?   local full_error = file_and_line_number..':'..test_name..' -- '..err_without_line_number..'\t\t'..stack_trace:gsub('\n', '\n\t\t')
   table.insert(Test_errors, full_error)
 end
 
diff --git a/drawing_tests.lua b/drawing_tests.lua
index 0c4de54..491ff3a 100644
--- a/drawing_tests.lua
+++ b/drawing_tests.lua
@@ -457,6 +457,41 @@ function test_name_point_then_hit_backspace()
   -- no crash
 end
 
+function test_name_point_then_exit_drawing()
+  -- create a drawing with a line
+  App.screen.init{width=Test_margin_left+256, height=300}  -- drawing coordinates 1:1 with pixels
+  Editor_state = edit.initialize_test_state()
+  Editor_state.filename = 'foo'
+  Editor_state.lines = load_array{'```lines', '```', ''}
+  Text.redraw_all(Editor_state)
+  edit.check_locs(Editor_state)
+  Editor_state.current_drawing_mode = 'line'
+  edit.draw(Editor_state)
+  -- draw a line
+  edit.run_after_mouse_press(Editor_state, Editor_state.left+5, Editor_state.top+Drawing_padding_top+6, 1)
+  edit.run_after_mouse_release(Editor_state, Editor_state.left+35, Editor_state.top+Drawing_padding_top+36, 1)
+  local drawing = Editor_state.lines[1]
+  check_eq(#drawing.shapes, 1, 'baseline/#shapes')
+  check_eq(#drawing.points, 2, 'baseline/#points')
+  check_eq(drawing.shapes[1].mode, 'line', 'baseline/shape:1')
+  local p1 = drawing.points[drawing.shapes[1].p1]
+  local p2 = drawing.points[drawing.shapes[1].p2]
+  check_eq(p1.x, 5, 'baseline/p1:x')
+  check_eq(p1.y, 6, 'baseline/p1:y')
+  check_eq(p2.x, 35, 'baseline/p2:x')
+  check_eq(p2.y, 36, 'baseline/p2:y')
+  check_nil(p2.name, 'baseline/p2:name')
+  -- enter 'name' mode without moving the mouse
+  edit.run_after_keychord(Editor_state, 'C-n')
+  check_eq(Editor_state.current_drawing_mode, 'name', 'mode:1')
+  -- click outside the drawing
+  edit.run_after_mouse_click(Editor_state, App.screen.width-5, App.screen.height-5, 1)
+  -- press a key
+  edit.run_after_text_input(Editor_state, 'a')
+  -- key goes to text
+  check_eq(Editor_state.lines[2].data, 'a')
+end
+
 function test_move_point()
   -- create a drawing with a line
   App.screen.init{width=Test_margin_left+256, height=300}  -- drawing coordinates 1:1 with pixels
diff --git a/edit.lua b/edit.lua
index 38c2883..3cea87f 100644
--- a/edit.lua
+++ b/edit.lua
@@ -226,7 +226,7 @@ end
 
 function edit.mouse_press(State, x,y, mouse_button)
   if State.search_term then return end
---?   print('press', State.selection1.line, State.selection1.pos)
+--?   print('press', State.cursor1.line)
   if mouse_press_consumed_by_any_button_handler(State, x,y, mouse_button) then
     -- press on a button and it returned 'true' to short-circuit
     return
@@ -269,7 +269,7 @@ end
 
 function edit.mouse_release(State, x,y, mouse_button)
   if State.search_term then return end
---?   print('release')
+--?   print('release', State.cursor1.line)
   if State.lines.current_drawing then
     Drawing.mouse_release(State, x,y, mouse_button)
     schedule_save(State)
@@ -321,11 +321,12 @@ function edit.mouse_wheel_move(State, dx,dy)
 end
 
 function edit.text_input(State, t)
+--?   print('text input', t)
   if State.search_term then
     State.search_term = State.search_term..t
     State.search_text = nil
     Text.search_next(State)
-  elseif State.current_drawing_mode == 'name' then
+  elseif State.lines.current_drawing and State.current_drawing_mode == 'name' then
     local before = snapshot(State, State.lines.current_drawing_index)
     local drawing = State.lines.current_drawing
     local p = drawing.points[drawing.pending.target_point]
@@ -478,7 +479,7 @@ function edit.keychord_press(State, chord, key)
         line.show_help = false
       end
     end
-  elseif State.current_drawing_mode == 'name' then
+  elseif State.lines.current_drawing and State.current_drawing_mode == 'name' then
     if chord == 'return' then
       State.current_drawing_mode = State.previous_drawing_mode
       State.previous_drawing_mode = nil
diff --git a/text.lua b/text.lua
index 35b30c4..589e4fd 100644
--- a/text.lua
+++ b/text.lua
@@ -161,6 +161,7 @@ function Text.text_input(State, t)
 end
 
 function Text.insert_at_cursor(State, t)
+  assert(State.lines[State.cursor1.line].mode == 'text')
   local byte_offset = Text.offset(State.lines[State.cursor1.line].data, State.cursor1.pos)
   State.lines[State.cursor1.line].data = string.sub(State.lines[State.cursor1.line].data, 1, byte_offset-1)..t..string.sub(State.lines[State.cursor1.line].data, byte_offset)
   Text.clear_screen_line_cache(State, State.cursor1.line)