@@ -32,6 +32,8 @@ import Test.Framework
32import Test.SmallCheck
32import Test.SmallCheck
33import Test.SmallCheck.Series
33import Test.SmallCheck.Series
35-- processing a block of 16 chars is the largest I can do without taking too long to run the test.
37-- processing a block of 16 chars is the largest I can do without taking too long to run the test.
36max_block_size :: Int
38max_block_size :: Int
37max_block_size = 16
39max_block_size = 16
@@ -58,7 +60,7 @@ synthesize_input input out_handle = forM_ input f >> (void $ fdWrite out_handle
58 f (Delay t) = threadDelay t
60 f (Delay t) = threadDelay t
60min_detectable_delay :: Int
62min_detectable_delay :: Int
61−min_detectable_delay = 1000
63+min_detectable_delay = 4000
63min_timout :: Int
65min_timout :: Int
64min_timout = 4000000
66min_timout = 4000000
@@ -80,6 +82,25 @@ gen_events_using_io_actions max_duration input_action output_action = do
80 Just () <- timeout max_duration' $ takeMVar read_complete
82 Just () <- timeout max_duration' $ takeMVar read_complete
85+compare_events input_spec expected_events out_events = compare_events' expected_events out_events
87+ compare_events' [] [] = return True
88+ compare_events' [] out_events' = do
89+ printf "extra events %s\n" (show out_events) :: IO ()
91+ compare_events' expected_events' [] = do
92+ printf "events %s were not produced for input %s\n" (show expected_events') (show input_spec) :: IO ()
93+ printf "expected events %s\n" (show expected_events) :: IO ()
94+ printf "received events %s\n" (show out_events) :: IO ()
96+ compare_events' (e : expected_events') (o : out_events')
97+ | e == o = compare_events' expected_events' out_events'
99+ printf "%s expected not %s for input %s\n" (show e) (show o) (show input_spec) :: IO ()
100+ printf "expected events %s\n" (show expected_events) :: IO ()
101+ printf "received events %s\n" (show out_events) :: IO ()
83assert_events_from_syn_input :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
104assert_events_from_syn_input :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
84assert_events_from_syn_input table input_spec expected_events = do
105assert_events_from_syn_input table input_spec expected_events = do
85 let max_duration = sum [t | Delay t <- input_spec] + min_detectable_delay
106 let max_duration = sum [t | Delay t <- input_spec] + min_detectable_delay
@@ -103,8 +124,7 @@ assert_events_from_syn_input table input_spec expected_events = do
103 read_loop (n - 1)
124 read_loop (n - 1)
104 gen_events_using_io_actions max_duration write_wait_close read_events
125 gen_events_using_io_actions max_duration write_wait_close read_events
105 out_events <- reverse <$> readIORef events_ref
126 out_events <- reverse <$> readIORef events_ref
106− print (input_spec, expected_events, out_events)
127+ compare_events input_spec expected_events out_events
107− return $ out_events == expected_events
109assert_events_from_input_block :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
129assert_events_from_input_block :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
110assert_events_from_input_block table input_spec expected_events = do
130assert_events_from_input_block table input_spec expected_events = do
@@ -162,7 +182,7 @@ verify_keys_from_caps_table_block_to_event = forAll $ \(InputBlocksUsingTable ge
162 input_seq = gen table
182 input_seq = gen table
163 events = [e | (_,e) <- input_seq]
183 events = [e | (_,e) <- input_seq]
164 keydowns = [Bytes s | (s,_) <- input_seq]
184 keydowns = [Bytes s | (s,_) <- input_seq]
165− input = intersperse (Delay test_key_delay) keydowns
185+ input = intersperse (Delay test_key_delay) keydowns ++ [Delay test_key_delay]
166 assert_events_from_input_block (map_to_legacy_table table) input events
186 assert_events_from_input_block (map_to_legacy_table table) input events
168verify_simple_syn_input_to_event :: Property IO
188verify_simple_syn_input_to_event :: Property IO
@@ -171,7 +191,7 @@ verify_simple_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) -> mona
171 input_seq = gen table
191 input_seq = gen table
172 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
192 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
173 keydowns = [Bytes s | (s,_) <- input_seq]
193 keydowns = [Bytes s | (s,_) <- input_seq]
174− input = intersperse (Delay test_key_delay) keydowns
194+ input = intersperse (Delay test_key_delay) keydowns ++ [Delay test_key_delay]
175 assert_events_from_syn_input (concat ansi_classify_table) input events
195 assert_events_from_syn_input (concat ansi_classify_table) input events
177verify_caps_syn_input_to_event :: Property IO
197verify_caps_syn_input_to_event :: Property IO
@@ -182,7 +202,7 @@ verify_caps_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) ->
182 input_seq = gen table
202 input_seq = gen table
183 events = [e | (_,e) <- input_seq]
203 events = [e | (_,e) <- input_seq]
184 keydowns = [Bytes s | (s,_) <- input_seq]
204 keydowns = [Bytes s | (s,_) <- input_seq]
185− input = intersperse (Delay test_key_delay) keydowns
205+ input = intersperse (Delay test_key_delay) keydowns ++ [Delay test_key_delay]
186 assert_events_from_syn_input (map_to_legacy_table table) input events
206 assert_events_from_syn_input (map_to_legacy_table table) input events
188verify_special_syn_input_to_event :: Property IO
208verify_special_syn_input_to_event :: Property IO
@@ -191,9 +211,20 @@ verify_special_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) -> mon
191 input_seq = gen table
211 input_seq = gen table
192 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
212 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
193 keydowns = [Bytes s | (s,_) <- input_seq]
213 keydowns = [Bytes s | (s,_) <- input_seq]
194− input = intersperse (Delay test_key_delay) keydowns
214+ input = intersperse (Delay test_key_delay) keydowns ++ [Delay test_key_delay]
195 assert_events_from_syn_input (concat ansi_classify_table) input events
215 assert_events_from_syn_input (concat ansi_classify_table) input events
217+verify_full_syn_input_to_event :: Property IO
218+verify_full_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) ->
219+ forEachOf terminals_of_interest $ \term_name -> monadic $ do
220+ term <- setupTerm term_name
221+ let table = classify_table_for_term term
222+ input_seq = gen table
223+ events = [EvKey k ms | (_,(k,ms)) <- input_seq]
224+ keydowns = [Bytes s | (s,_) <- input_seq]
225+ input = intersperse (Delay test_key_delay) keydowns ++ [Delay test_key_delay]
226+ assert_events_from_syn_input table input events
197main :: IO ()
228main :: IO ()
198main = defaultMain
229main = defaultMain
199 [ testProperty "basic block generated from a single visible chars to event translation"
230 [ testProperty "basic block generated from a single visible chars to event translation"
@@ -206,5 +237,7 @@ main = defaultMain
206 verify_caps_syn_input_to_event
237 verify_caps_syn_input_to_event
207 , testProperty "synthesized typing from hard coded special keys translates to expected events"
238 , testProperty "synthesized typing from hard coded special keys translates to expected events"
208 verify_special_syn_input_to_event
239 verify_special_syn_input_to_event
240+ , testProperty "synthesized typing from any key in the table translates to expected events"
241+ verify_full_syn_input_to_event