@@ -32,6 +32,8 @@ import Test.Framework
3232import Test.SmallCheck
3333import Test.SmallCheck.Series
3434
35+import Text.Printf
36+
3537-- processing a block of 16 chars is the largest I can do without taking too long to run the test.
3638max_block_size :: Int
3739max_block_size = 16
@@ -58,7 +60,7 @@ synthesize_input input out_handle = forM_ input f >> (void $ fdWrite out_handle
5860 f (Delay t) = threadDelay t
5961
6062min_detectable_delay :: Int
61−min_detectable_delay = 1000
63+min_detectable_delay = 4000
6264
6365min_timout :: Int
6466min_timout = 4000000
@@ -80,6 +82,25 @@ gen_events_using_io_actions max_duration input_action output_action = do
8082 Just () <- timeout max_duration' $ takeMVar read_complete
8183 return ()
8284
85+compare_events input_spec expected_events out_events = compare_events' expected_events out_events
86+ where
87+ compare_events' [] [] = return True
88+ compare_events' [] out_events' = do
89+ printf "extra events %s\n" (show out_events) :: IO ()
90+ return False
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 ()
95+ return False
96+ compare_events' (e : expected_events') (o : out_events')
97+ | e == o = compare_events' expected_events' out_events'
98+ | otherwise = do
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 ()
102+ return False
103+
83104assert_events_from_syn_input :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
84105assert_events_from_syn_input table input_spec expected_events = do
85106 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
103124 read_loop (n - 1)
104125 gen_events_using_io_actions max_duration write_wait_close read_events
105126 out_events <- reverse <$> readIORef events_ref
106− print (input_spec, expected_events, out_events)
107− return $ out_events == expected_events
127+ compare_events input_spec expected_events out_events
108128
109129assert_events_from_input_block :: ClassifyTable -> InputSpec -> ExpectedSpec -> IO Bool
110130assert_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
162182 input_seq = gen table
163183 events = [e | (_,e) <- input_seq]
164184 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]
166186 assert_events_from_input_block (map_to_legacy_table table) input events
167187
168188verify_simple_syn_input_to_event :: Property IO
@@ -171,7 +191,7 @@ verify_simple_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) -> mona
171191 input_seq = gen table
172192 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
173193 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]
175195 assert_events_from_syn_input (concat ansi_classify_table) input events
176196
177197verify_caps_syn_input_to_event :: Property IO
@@ -182,7 +202,7 @@ verify_caps_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) ->
182202 input_seq = gen table
183203 events = [e | (_,e) <- input_seq]
184204 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]
186206 assert_events_from_syn_input (map_to_legacy_table table) input events
187207
188208verify_special_syn_input_to_event :: Property IO
@@ -191,9 +211,20 @@ verify_special_syn_input_to_event = forAll $ \(InputBlocksUsingTable gen) -> mon
191211 input_seq = gen table
192212 events = [EvKey k ms | (_,(k,ms)) <- input_seq]
193213 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]
195215 assert_events_from_syn_input (concat ansi_classify_table) input events
196216
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
227+
197228main :: IO ()
198229main = defaultMain
199230 [ testProperty "basic block generated from a single visible chars to event translation"
@@ -206,5 +237,7 @@ main = defaultMain
206237 verify_caps_syn_input_to_event
207238 , testProperty "synthesized typing from hard coded special keys translates to expected events"
208239 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
209242 ]
210243