1use phf::phf_map;
2
3mod ascii {
4 pub const UPPERCASE_A: u8 = 0x41; pub const UPPERCASE_Z: u8 = 0x5A; pub const LOWERCASE_A: u8 = 0x61; pub const LOWERCASE_Z: u8 = 0x7A; pub const ZERO: u8 = 0x30; pub const NINE: u8 = 0x39; }
14
15mod vk {
16 pub const VK_SHIFT: u8 = 0x10; }
19
20#[derive(PartialEq)]
22#[derive(Debug)]
23pub enum ErrorCodes {
24 NotFound,
26 OutOfRange
28}
29
30#[derive(PartialEq)]
31#[derive(Debug)]
32pub struct KeyError {
33 pub byte: u8,
37 pub error_code: ErrorCodes
39}
40
41const ASCII_LOWERCASE_TO_UPPERCASE_OFFSET_AND_ASCII_MIN_VALUE: u8 = 32;
44const MAX_VALID_ASCII_CHAR_SIZE: u8 = 127;
45
46static CHAR_TO_KEY_MAP: phf::Map<u8, u16> = phf_map! {
47 0x2Au8 => 0x6A, 0x2Du8 => 0x6D, 0x3Du8 => 0xBB, 0x2Eu8 => 0xBE, 0x2Fu8 => 0x6F, 0x20u8 => 0x20, 0x3Bu8 => 0xBA, 0x60u8 => 0xC0, 0x5Bu8 => 0xDB, 0x5Cu8 => 0xDC, 0x5Du8 => 0xDD, 0x27u8 => 0xDE, 0x2Cu8 => 0xBC, 0x21u8 => 0x0131, 0x40u8 => 0x0132, 0x23u8 => 0x0133, 0x24u8 => 0x0134, 0x25u8 => 0x0135, 0x5Eu8 => 0x0136, 0x26u8 => 0x0137, 0x28u8 => 0x0139, 0x29u8 => 0x0130, 0x2Bu8 => 0x01BB, 0x3Au8 => 0x01BA, 0x3Fu8 => 0x01BF, 0x7Eu8 => 0x01C0, 0x7Bu8 => 0x01DB, 0x7Du8 => 0x01DD, 0x7Cu8 => 0x01DC, 0x22u8 => 0x01DE, 0x3Cu8 => 0x01BC, 0x3Eu8 => 0x01BE, 0x5Fu8 => 0x01BD, };
85
86pub fn to_keystrokes_new(keys: &str) -> Result<Vec<u8>, KeyError> {
88 let mut keystrokes = Vec::new();
89 to_keystrokes_mut(keys, &mut keystrokes)?;
90 Ok(keystrokes)
91}
92
93pub fn to_keystrokes_mut(keys: &str, keystrokes: &mut Vec<u8>) -> Result<(), KeyError> {
94 let characters = keys.as_bytes();
95 let length = keys.len();
96
97 let mut char;
98 let mut is_shifting = false;
99 let mut key_requires_shift: bool; for i in 0..length {
101 char = characters[i];
102
103 if char >= MAX_VALID_ASCII_CHAR_SIZE || char < ASCII_LOWERCASE_TO_UPPERCASE_OFFSET_AND_ASCII_MIN_VALUE {
105 return Err(KeyError{
106 byte: char,
107 error_code: ErrorCodes::OutOfRange
108 })
109 }
110
111 if char >= ascii::UPPERCASE_A && char <= ascii::UPPERCASE_Z {
113 if !is_shifting {
114 is_shifting = true;
115 keystrokes.push(vk::VK_SHIFT);
116 }
117 keystrokes.push(char);
118 continue }
120
121 if char >= ascii::LOWERCASE_A && char <= ascii::LOWERCASE_Z {
123 if is_shifting { is_shifting = false;
125 keystrokes.push(vk::VK_SHIFT);
126 }
127 keystrokes.push(char - ASCII_LOWERCASE_TO_UPPERCASE_OFFSET_AND_ASCII_MIN_VALUE);
128 continue }
130
131 if char >= ascii::ZERO && char <= ascii::NINE {
133 if is_shifting { is_shifting = false;
135 keystrokes.push(vk::VK_SHIFT);
136 }
137 keystrokes.push(char); continue
139 }
140
141 if let Some(code) = CHAR_TO_KEY_MAP.get(&char) {
142 let vkc = code & 0xFF;
143 let high_bits = code >> 0x8;
144
145 key_requires_shift = high_bits == 0x1u16;
166 if is_shifting && !key_requires_shift { is_shifting = false;
168 keystrokes.push(vk::VK_SHIFT);
169 }
170 else if !is_shifting && key_requires_shift { is_shifting = true;
172 keystrokes.push(vk::VK_SHIFT);
173 }
174 keystrokes.push(vkc as u8);
176 continue
177 }
178
179 return Err(KeyError {
180 byte: char,
181 error_code: ErrorCodes::NotFound
182 })
183 }
184
185 if is_shifting { keystrokes.push(vk::VK_SHIFT); }
188
189 Ok(())
190}
191
192
193
194#[cfg(test)]
199mod tests {
200 use super::*;
201
202 pub const VK_A: u8 = 0x41; pub const VK_B: u8 = 0x42; pub const VK_C: u8 = 0x43; pub const VK_Z: u8 = 0x5A; pub const VK_0: u8 = 0x30; pub const VK_1: u8 = 0x31; pub const VK_2: u8 = 0x32; pub const VK_3: u8 = 0x33; pub const VK_4: u8 = 0x34; pub const VK_5: u8 = 0x35; pub const VK_6: u8 = 0x36; pub const VK_7: u8 = 0x37; pub const VK_8: u8 = 0x38; pub const VK_9: u8 = 0x39; pub const VK_SPACE: u8 = 0x20; pub const VK_MULTIPLY: u8 = 0x6A; pub const VK_MINUS: u8 = 0x6D; pub const VK_DIVIDE: u8 = 0x6F; pub const VK_OEM_1: u8 = 0xBA; pub const VK_OEM_PLUS: u8 = 0xBB; pub const VK_OEM_MINUS: u8 = 0xBD; pub const VK_OEM_COMMA: u8 = 0xBC; pub const VK_OEM_PERIOD: u8 = 0xBE; pub const VK_OEM_2: u8 = 0xBF; pub const VK_OEM_3: u8 = 0xC0; pub const VK_OEM_4: u8 = 0xDB; pub const VK_OEM_5: u8 = 0xDC; pub const VK_OEM_6: u8 = 0xDD; pub const VK_OEM_7: u8 = 0xDE; #[test]
237 fn test_non_valid_character_results_in_error() {
238 let strokes = to_keystrokes_new("æ");
239
240 assert_eq!(strokes.is_err(), true, "should contain error from bounds check");
241 let err_code = strokes.unwrap_err().error_code;
243 assert_eq!(err_code, ErrorCodes::OutOfRange, "character provided exceeds valid ASCII character range");
244 }
245
246 mod alphabetical {
247 use super::*;
248
249
250 #[test]
251 fn test_lowercase_a() {
252 let strokes = to_keystrokes_new("a").unwrap();
253
254 assert_eq!(strokes.len(), 1, "incorrect key vector length");
255 assert_eq!(strokes[0], VK_A);
256 }
257
258 #[test]
259 fn test_lowercase_z() {
260 let strokes = to_keystrokes_new("z").unwrap();
261
262 assert_eq!(strokes.len(), 1, "incorrect key vector length");
263 assert_eq!(strokes[0], VK_Z);
264 }
265
266 #[test]
267 fn test_uppercase_a() {
268 let strokes = to_keystrokes_new("A").unwrap();
269
270 assert_eq!(strokes.len(), 3, "incorrect key vector length");
271 assert_eq!(strokes[0], vk::VK_SHIFT);
272 assert_eq!(strokes[1], VK_A);
273 assert_eq!(strokes[2], vk::VK_SHIFT);
274 }
275
276 #[test]
277 fn test_uppercase_z() {
278 let strokes = to_keystrokes_new("Z").unwrap();
279
280 assert_eq!(strokes.len(), 3, "incorrect key vector length");
281 assert_eq!(strokes[0], vk::VK_SHIFT);
282 assert_eq!(strokes[1], VK_Z);
283 assert_eq!(strokes[2], vk::VK_SHIFT);
284 }
285
286 #[test]
287 fn test_multiple_lowercases() {
288 let strokes = to_keystrokes_new("abc").unwrap();
289
290 assert_eq!(strokes.len(), 3, "incorrect key vector length");
291 assert_eq!(strokes[0], VK_A);
292 assert_eq!(strokes[1], VK_B);
293 assert_eq!(strokes[2], VK_C);
294 }
295
296 #[test]
297 fn test_multiple_uppercases() {
298 let strokes = to_keystrokes_new("ABC").unwrap();
299
300 assert_eq!(strokes.len(), 5, "incorrect key vector length");
301 assert_eq!(strokes[0], vk::VK_SHIFT);
302 assert_eq!(strokes[1], VK_A);
303 assert_eq!(strokes[2], VK_B);
304 assert_eq!(strokes[3], VK_C);
305 assert_eq!(strokes[4], vk::VK_SHIFT);
306 }
307
308 #[test]
309 fn test_multiple_mixed_cases_v1() {
310 let strokes = to_keystrokes_new("aBc").unwrap();
311
312 assert_eq!(strokes.len(), 5, "incorrect key vector length");
313 assert_eq!(strokes[0], VK_A);
314 assert_eq!(strokes[1], vk::VK_SHIFT);
315 assert_eq!(strokes[2], VK_B);
316 assert_eq!(strokes[3], vk::VK_SHIFT);
317 assert_eq!(strokes[4], VK_C);
318 }
319
320 #[test]
321 fn test_multiple_mixed_cases_v2() {
322 let strokes = to_keystrokes_new("abcABCabc").unwrap();
323
324 assert_eq!(strokes.len(), 11, "incorrect key vector length");
325 assert_eq!(strokes[0], VK_A);
326 assert_eq!(strokes[1], VK_B);
327 assert_eq!(strokes[2], VK_C);
328
329 assert_eq!(strokes[3], vk::VK_SHIFT);
330 assert_eq!(strokes[4], VK_A);
331 assert_eq!(strokes[5], VK_B);
332 assert_eq!(strokes[6], VK_C);
333 assert_eq!(strokes[7], vk::VK_SHIFT);
334
335 assert_eq!(strokes[8], VK_A);
336 assert_eq!(strokes[9], VK_B);
337 assert_eq!(strokes[10], VK_C);
338 }
339
340 #[test]
341 fn test_multiple_mixed_cases_v3() {
342 let strokes = to_keystrokes_new("ZbcAzCaZc").unwrap();
343
344 assert_eq!(strokes.len(), 17, "incorrect key vector length");
345 assert_eq!(strokes[0], vk::VK_SHIFT);
346 assert_eq!(strokes[1], VK_Z);
347 assert_eq!(strokes[2], vk::VK_SHIFT);
348
349 assert_eq!(strokes[3], VK_B);
350 assert_eq!(strokes[4], VK_C);
351
352 assert_eq!(strokes[5], vk::VK_SHIFT);
353 assert_eq!(strokes[6], VK_A);
354 assert_eq!(strokes[7], vk::VK_SHIFT);
355
356 assert_eq!(strokes[8], VK_Z);
357
358 assert_eq!(strokes[9], vk::VK_SHIFT);
359 assert_eq!(strokes[10], VK_C);
360 assert_eq!(strokes[11], vk::VK_SHIFT);
361
362 assert_eq!(strokes[12], VK_A);
363
364 assert_eq!(strokes[13], vk::VK_SHIFT);
365 assert_eq!(strokes[14], VK_Z);
366 assert_eq!(strokes[15], vk::VK_SHIFT);
367
368 assert_eq!(strokes[16], VK_C);
369 }
370 }
371
372 mod vk_0_through_vk_9 {
373 use super::*;
374
375 #[test]
376 fn test_number_one() {
377 let strokes = to_keystrokes_new("1").unwrap();
378
379 assert_eq!(strokes.len(), 1, "incorrect key vector length");
380 assert_eq!(strokes[0], VK_1);
381 }
382
383 #[test]
384 fn test_exclamation_mark() {
385 let strokes = to_keystrokes_new("!").unwrap();
386
387 assert_eq!(strokes.len(), 3, "incorrect key vector length");
388 assert_eq!(strokes[0], vk::VK_SHIFT);
389 assert_eq!(strokes[1], VK_1);
390 assert_eq!(strokes[2], vk::VK_SHIFT);
391 }
392
393 #[test]
394 fn test_number_two() {
395 let strokes = to_keystrokes_new("2").unwrap();
396
397 assert_eq!(strokes.len(), 1, "incorrect key vector length");
398 assert_eq!(strokes[0], VK_2);
399 }
400
401 #[test]
402 fn test_at_sign() {
403 let strokes = to_keystrokes_new("@").unwrap();
404
405 assert_eq!(strokes.len(), 3, "incorrect key vector length");
406 assert_eq!(strokes[0], vk::VK_SHIFT);
407 assert_eq!(strokes[1], VK_2);
408 assert_eq!(strokes[2], vk::VK_SHIFT);
409 }
410
411 #[test]
412 fn test_number_three() {
413 let strokes = to_keystrokes_new("3").unwrap();
414
415 assert_eq!(strokes.len(), 1, "incorrect key vector length");
416 assert_eq!(strokes[0], VK_3);
417 }
418
419 #[test]
420 fn test_hash() {
421 let strokes = to_keystrokes_new("#").unwrap();
422
423 assert_eq!(strokes.len(), 3, "incorrect key vector length");
424 assert_eq!(strokes[0], vk::VK_SHIFT);
425 assert_eq!(strokes[1], VK_3);
426 assert_eq!(strokes[2], vk::VK_SHIFT);
427 }
428
429 #[test]
430 fn test_number_four() {
431 let strokes = to_keystrokes_new("4").unwrap();
432
433 assert_eq!(strokes.len(), 1, "incorrect key vector length");
434 assert_eq!(strokes[0], VK_4);
435 }
436
437 #[test]
438 fn test_dollar_sign() {
439 let strokes = to_keystrokes_new("$").unwrap();
440
441 assert_eq!(strokes.len(), 3, "incorrect key vector length");
442 assert_eq!(strokes[0], vk::VK_SHIFT);
443 assert_eq!(strokes[1], VK_4);
444 assert_eq!(strokes[2], vk::VK_SHIFT);
445 }
446
447 #[test]
448 fn test_number_five() {
449 let strokes = to_keystrokes_new("5").unwrap();
450
451 assert_eq!(strokes.len(), 1, "incorrect key vector length");
452 assert_eq!(strokes[0], VK_5);
453 }
454
455 #[test]
456 fn test_percent() {
457 let strokes = to_keystrokes_new("%").unwrap();
458
459 assert_eq!(strokes.len(), 3, "incorrect key vector length");
460 assert_eq!(strokes[0], vk::VK_SHIFT);
461 assert_eq!(strokes[1], VK_5);
462 assert_eq!(strokes[2], vk::VK_SHIFT);
463 }
464
465 #[test]
466 fn test_number_six() {
467 let strokes = to_keystrokes_new("6").unwrap();
468
469 assert_eq!(strokes.len(), 1, "incorrect key vector length");
470 assert_eq!(strokes[0], VK_6);
471 }
472
473 #[test]
474 fn test_caret() {
475 let strokes = to_keystrokes_new("^").unwrap();
476
477 assert_eq!(strokes.len(), 3, "incorrect key vector length");
478 assert_eq!(strokes[0], vk::VK_SHIFT);
479 assert_eq!(strokes[1], VK_6);
480 assert_eq!(strokes[2], vk::VK_SHIFT);
481 }
482
483 #[test]
484 fn test_seven() {
485 let strokes = to_keystrokes_new("7").unwrap();
486
487 assert_eq!(strokes.len(), 1, "incorrect key vector length");
488 assert_eq!(strokes[0], VK_7);
489 }
490
491 #[test]
492 fn test_ampersand() {
493 let strokes = to_keystrokes_new("&").unwrap();
494
495 assert_eq!(strokes.len(), 3, "incorrect key vector length");
496 assert_eq!(strokes[0], vk::VK_SHIFT);
497 assert_eq!(strokes[1], VK_7);
498 assert_eq!(strokes[2], vk::VK_SHIFT);
499 }
500
501 #[test]
502 fn test_number_eight() {
503 let strokes = to_keystrokes_new("8").unwrap();
504
505 assert_eq!(strokes.len(), 1, "incorrect key vector length");
506 assert_eq!(strokes[0], VK_8);
507 }
508
509 #[test]
510 fn test_number_9() {
511 let strokes = to_keystrokes_new("9").unwrap();
512
513 assert_eq!(strokes.len(), 1, "incorrect key vector length");
514 assert_eq!(strokes[0], VK_9);
515 }
516
517 #[test]
518 fn test_left_paren() {
519 let strokes = to_keystrokes_new("(").unwrap();
520
521 assert_eq!(strokes.len(), 3, "incorrect key vector length");
522 assert_eq!(strokes[0], vk::VK_SHIFT);
523 assert_eq!(strokes[1], VK_9);
524 assert_eq!(strokes[2], vk::VK_SHIFT);
525 }
526
527 #[test]
528 fn test_number_zero() {
529 let strokes = to_keystrokes_new("0").unwrap();
530
531 assert_eq!(strokes.len(), 1, "incorrect key vector length");
532 assert_eq!(strokes[0], VK_0);
533 }
534
535 #[test]
536 fn test_right_paren() {
537 let strokes = to_keystrokes_new(")").unwrap();
538
539 assert_eq!(strokes.len(), 3, "incorrect key vector length");
540 assert_eq!(strokes[0], vk::VK_SHIFT);
541 assert_eq!(strokes[1], VK_0);
542 assert_eq!(strokes[2], vk::VK_SHIFT);
543 }
544 }
545
546 #[test]
547 fn test_multiply() {
548 let strokes = to_keystrokes_new("*").unwrap();
549
550 assert_eq!(strokes.len(), 1, "incorrect key vector length");
551 assert_eq!(strokes[0], VK_MULTIPLY);
552 }
553
554 #[test]
555 fn test_plus() {
556 let strokes = to_keystrokes_new("+").unwrap();
557
558 assert_eq!(strokes.len(), 3, "incorrect key vector length");
559 assert_eq!(strokes[0], vk::VK_SHIFT);
560 assert_eq!(strokes[1], VK_OEM_PLUS);
561 assert_eq!(strokes[2], vk::VK_SHIFT);
562 }
563
564 #[test]
565 fn test_minus() {
566 let strokes = to_keystrokes_new("-").unwrap();
567
568 assert_eq!(strokes.len(), 1, "incorrect key vector length");
569 assert_eq!(strokes[0], VK_MINUS);
570 }
571
572 #[test]
573 fn test_comma() {
574 let strokes = to_keystrokes_new(",").unwrap();
575
576 assert_eq!(strokes.len(), 1, "incorrect key vector length");
577 assert_eq!(strokes[0], VK_OEM_COMMA);
578 }
579
580 #[test]
581 fn test_divide() {
582 let strokes = to_keystrokes_new("/").unwrap();
583
584 assert_eq!(strokes.len(), 1, "incorrect key vector length");
585 assert_eq!(strokes[0], VK_DIVIDE);
586 }
587
588 #[test]
589 fn test_period() {
590 let strokes = to_keystrokes_new(".").unwrap();
591
592 assert_eq!(strokes.len(), 1, "incorrect key vector length");
593 assert_eq!(strokes[0], VK_OEM_PERIOD);
594 }
595
596 #[test]
597 fn test_white_space() {
598 let strokes = to_keystrokes_new(" ").unwrap();
599
600 assert_eq!(strokes.len(), 1, "incorrect key vector length");
601 assert_eq!(strokes[0], VK_SPACE);
602 }
603
604 #[test]
605 fn test_semi_colon() {
606 let strokes = to_keystrokes_new(";").unwrap();
607
608 assert_eq!(strokes.len(), 1, "incorrect key vector length");
609 assert_eq!(strokes[0], VK_OEM_1);
610 }
611
612 #[test]
613 fn test_colon() {
614 let strokes = to_keystrokes_new(":").unwrap();
615
616 assert_eq!(strokes.len(), 3, "incorrect key vector length");
617 assert_eq!(strokes[0], vk::VK_SHIFT);
618 assert_eq!(strokes[1], VK_OEM_1);
619 assert_eq!(strokes[2], vk::VK_SHIFT);
620 }
621
622 #[test]
623 fn test_question_mark() {
624 let strokes = to_keystrokes_new("?").unwrap();
625
626 assert_eq!(strokes.len(), 3, "incorrect key vector length");
627 assert_eq!(strokes[0], vk::VK_SHIFT);
628 assert_eq!(strokes[1], VK_OEM_2);
629 assert_eq!(strokes[2], vk::VK_SHIFT);
630 }
631
632 #[test]
633 fn test_backtick() {
634 let strokes = to_keystrokes_new("`").unwrap();
635
636 assert_eq!(strokes.len(), 1, "incorrect key vector length");
637 assert_eq!(strokes[0], VK_OEM_3);
638 }
639
640 #[test]
641 fn test_tilde() {
642 let strokes = to_keystrokes_new("~").unwrap();
643
644 assert_eq!(strokes.len(), 3, "incorrect key vector length");
645 assert_eq!(strokes[0], vk::VK_SHIFT);
646 assert_eq!(strokes[1], VK_OEM_3);
647 assert_eq!(strokes[2], vk::VK_SHIFT);
648 }
649
650 #[test]
651 fn test_left_bracket() {
652 let strokes = to_keystrokes_new("[").unwrap();
653
654 assert_eq!(strokes.len(), 1, "incorrect key vector length");
655 assert_eq!(strokes[0], VK_OEM_4);
656 }
657
658 #[test]
659 fn test_left_curly_bracket() {
660 let strokes = to_keystrokes_new("{").unwrap();
661
662 assert_eq!(strokes.len(), 3, "incorrect key vector length");
663 assert_eq!(strokes[0], vk::VK_SHIFT);
664 assert_eq!(strokes[1], VK_OEM_4);
665 assert_eq!(strokes[2], vk::VK_SHIFT);
666 }
667
668 #[test]
669 fn test_backslash() {
670 let strokes = to_keystrokes_new("\\").unwrap();
671
672 assert_eq!(strokes.len(), 1, "incorrect key vector length");
673 assert_eq!(strokes[0], VK_OEM_5);
674 }
675
676 #[test]
677 fn test_vertical_bar() {
678 let strokes = to_keystrokes_new("|").unwrap();
679
680 assert_eq!(strokes.len(), 3, "incorrect key vector length");
681 assert_eq!(strokes[0], vk::VK_SHIFT);
682 assert_eq!(strokes[1], VK_OEM_5);
683 assert_eq!(strokes[2], vk::VK_SHIFT);
684 }
685
686 #[test]
687 fn test_right_bracket() {
688 let strokes = to_keystrokes_new("]").unwrap();
689
690 assert_eq!(strokes.len(), 1, "incorrect key vector length");
691 assert_eq!(strokes[0], VK_OEM_6);
692 }
693
694 #[test]
695 fn test_right_curly_bracket() {
696 let strokes = to_keystrokes_new("}").unwrap();
697
698 assert_eq!(strokes.len(), 3, "incorrect key vector length");
699 assert_eq!(strokes[0], vk::VK_SHIFT);
700 assert_eq!(strokes[1], VK_OEM_6);
701 assert_eq!(strokes[2], vk::VK_SHIFT);
702 }
703
704 #[test]
705 fn test_single_quote() {
706 let strokes = to_keystrokes_new("'").unwrap();
707
708 assert_eq!(strokes.len(), 1, "incorrect key vector length");
709 assert_eq!(strokes[0], VK_OEM_7);
710 }
711
712 #[test]
713 fn test_double_quote() {
714 let strokes = to_keystrokes_new("\"").unwrap();
715
716 assert_eq!(strokes.len(), 3, "incorrect key vector length");
717 assert_eq!(strokes[0], vk::VK_SHIFT);
718 assert_eq!(strokes[1], VK_OEM_7);
719 assert_eq!(strokes[2], vk::VK_SHIFT);
720 }
721
722 #[test]
723 fn test_less_than() {
724 let strokes = to_keystrokes_new("<").unwrap();
725
726 assert_eq!(strokes.len(), 3, "incorrect key vector length");
727 assert_eq!(strokes[0], vk::VK_SHIFT);
728 assert_eq!(strokes[1], VK_OEM_COMMA);
729 assert_eq!(strokes[2], vk::VK_SHIFT);
730 }
731
732 #[test]
733 fn test_greater_than() {
734 let strokes = to_keystrokes_new(">").unwrap();
735
736 assert_eq!(strokes.len(), 3, "incorrect key vector length");
737 assert_eq!(strokes[0], vk::VK_SHIFT);
738 assert_eq!(strokes[1], VK_OEM_PERIOD);
739 assert_eq!(strokes[2], vk::VK_SHIFT);
740 }
741
742 #[test]
743 fn test_equal() {
744 let strokes = to_keystrokes_new("=").unwrap();
745
746 assert_eq!(strokes.len(), 1, "incorrect key vector length");
747 assert_eq!(strokes[0], VK_OEM_PLUS);
748 }
749
750 #[test]
751 fn test_underscore() {
752 let strokes = to_keystrokes_new("_").unwrap();
753
754 assert_eq!(strokes.len(), 3, "incorrect key vector length");
755 assert_eq!(strokes[0], vk::VK_SHIFT);
756 assert_eq!(strokes[1], VK_OEM_MINUS);
757 assert_eq!(strokes[2], vk::VK_SHIFT);
758 }
759}