@@ -421,6 +421,69 @@ mod tests {
421421 assert_eq ! ( processor. state. ipt, 2 ) ;
422422 }
423423
424+ const CONDITION_TESTS : & [ ( & str , & str , & str , bool ) ] = & [
425+ // equal
426+ ( "equal" , "0" , "0" , true ) ,
427+ ( "equal" , "0" , "null" , true ) ,
428+ ( "equal" , "1" , r#""""# , true ) ,
429+ ( "equal" , "1" , r#""foo""# , true ) ,
430+ ( "equal" , r#""""# , r#""""# , true ) ,
431+ ( "equal" , r#""abc""# , r#""abc""# , true ) ,
432+ ( "equal" , "null" , "null" , true ) ,
433+ ( "equal" , "0" , "0.0000009" , true ) ,
434+ ( "equal" , "@pi" , "3.1415927" , true ) ,
435+ ( "equal" , "π" , "3.1415927" , true ) ,
436+ ( "equal" , "@e" , "2.7182818" , true ) ,
437+ ( "equal" , "0" , "0.000001" , false ) ,
438+ ( "equal" , "0" , "1" , false ) ,
439+ ( "equal" , "1" , "null" , false ) ,
440+ ( "equal" , r#""abc""# , r#""def""# , false ) ,
441+ // notEqual
442+ ( "notEqual" , "0" , "0" , false ) ,
443+ ( "notEqual" , "0" , "null" , false ) ,
444+ ( "notEqual" , "null" , "null" , false ) ,
445+ ( "notEqual" , "0" , "0.0000009" , false ) ,
446+ ( "notEqual" , "0" , "0.000001" , true ) ,
447+ ( "notEqual" , "0" , "1" , true ) ,
448+ ( "notEqual" , "1" , "null" , true ) ,
449+ // lessThan
450+ ( "lessThan" , "0" , "1" , true ) ,
451+ ( "lessThan" , "0" , "0" , false ) ,
452+ ( "lessThan" , "1" , "0" , false ) ,
453+ // lessThanEq
454+ ( "lessThanEq" , "0" , "1" , true ) ,
455+ ( "lessThanEq" , "0" , "0" , true ) ,
456+ ( "lessThanEq" , "1" , "0" , false ) ,
457+ // greaterThan
458+ ( "greaterThan" , "0" , "1" , false ) ,
459+ ( "greaterThan" , "0" , "0" , false ) ,
460+ ( "greaterThan" , "1" , "0" , true ) ,
461+ // greaterThanEq
462+ ( "greaterThanEq" , "0" , "1" , false ) ,
463+ ( "greaterThanEq" , "0" , "0" , true ) ,
464+ ( "greaterThanEq" , "1" , "0" , true ) ,
465+ // strictEqual
466+ ( "strictEqual" , "0" , "0" , true ) ,
467+ ( "strictEqual" , "0.5" , "0.5" , true ) ,
468+ ( "strictEqual" , "@pi" , "3.1415927" , true ) ,
469+ ( "strictEqual" , "null" , "null" , true ) ,
470+ ( "strictEqual" , r#""""# , r#""""# , true ) ,
471+ ( "strictEqual" , r#""abc""# , r#""abc""# , true ) ,
472+ ( "strictEqual" , "0" , "null" , false ) ,
473+ ( "strictEqual" , "1" , r#""""# , false ) ,
474+ ( "strictEqual" , "1" , r#""foo""# , false ) ,
475+ ( "strictEqual" , r#""abc""# , r#""def""# , false ) ,
476+ ( "strictEqual" , "0" , "0.0000009" , false ) ,
477+ ( "strictEqual" , "0" , "0.000001" , false ) ,
478+ ( "strictEqual" , "0" , "1" , false ) ,
479+ ( "strictEqual" , "1" , "null" , false ) ,
480+ // always
481+ ( "always" , "0" , "0" , true ) ,
482+ ( "always" , "0" , "1" , true ) ,
483+ ( "always" , "1" , "0" , true ) ,
484+ ( "always" , "1" , "1" , true ) ,
485+ ] ;
486+
424487 #[ test]
425488 fn test_jump ( ) {
426489 let mut code = r#"
@@ -447,71 +510,7 @@ mod tests {
447510 "#
448511 . to_string ( ) ;
449512
450- for ( i, ( cond, x, y, want_jump) ) in [
451- // equal
452- ( "equal" , "0" , "0" , true ) ,
453- ( "equal" , "0" , "null" , true ) ,
454- ( "equal" , "1" , r#""""# , true ) ,
455- ( "equal" , "1" , r#""foo""# , true ) ,
456- ( "equal" , r#""""# , r#""""# , true ) ,
457- ( "equal" , r#""abc""# , r#""abc""# , true ) ,
458- ( "equal" , "null" , "null" , true ) ,
459- ( "equal" , "0" , "0.0000009" , true ) ,
460- ( "equal" , "@pi" , "3.1415927" , true ) ,
461- ( "equal" , "π" , "3.1415927" , true ) ,
462- ( "equal" , "@e" , "2.7182818" , true ) ,
463- ( "equal" , "0" , "0.000001" , false ) ,
464- ( "equal" , "0" , "1" , false ) ,
465- ( "equal" , "1" , "null" , false ) ,
466- ( "equal" , r#""abc""# , r#""def""# , false ) ,
467- // notEqual
468- ( "notEqual" , "0" , "0" , false ) ,
469- ( "notEqual" , "0" , "null" , false ) ,
470- ( "notEqual" , "null" , "null" , false ) ,
471- ( "notEqual" , "0" , "0.0000009" , false ) ,
472- ( "notEqual" , "0" , "0.000001" , true ) ,
473- ( "notEqual" , "0" , "1" , true ) ,
474- ( "notEqual" , "1" , "null" , true ) ,
475- // lessThan
476- ( "lessThan" , "0" , "1" , true ) ,
477- ( "lessThan" , "0" , "0" , false ) ,
478- ( "lessThan" , "1" , "0" , false ) ,
479- // lessThanEq
480- ( "lessThanEq" , "0" , "1" , true ) ,
481- ( "lessThanEq" , "0" , "0" , true ) ,
482- ( "lessThanEq" , "1" , "0" , false ) ,
483- // greaterThan
484- ( "greaterThan" , "0" , "1" , false ) ,
485- ( "greaterThan" , "0" , "0" , false ) ,
486- ( "greaterThan" , "1" , "0" , true ) ,
487- // greaterThanEq
488- ( "greaterThanEq" , "0" , "1" , false ) ,
489- ( "greaterThanEq" , "0" , "0" , true ) ,
490- ( "greaterThanEq" , "1" , "0" , true ) ,
491- // strictEqual
492- ( "strictEqual" , "0" , "0" , true ) ,
493- ( "strictEqual" , "0.5" , "0.5" , true ) ,
494- ( "strictEqual" , "@pi" , "3.1415927" , true ) ,
495- ( "strictEqual" , "null" , "null" , true ) ,
496- ( "strictEqual" , r#""""# , r#""""# , true ) ,
497- ( "strictEqual" , r#""abc""# , r#""abc""# , true ) ,
498- ( "strictEqual" , "0" , "null" , false ) ,
499- ( "strictEqual" , "1" , r#""""# , false ) ,
500- ( "strictEqual" , "1" , r#""foo""# , false ) ,
501- ( "strictEqual" , r#""abc""# , r#""def""# , false ) ,
502- ( "strictEqual" , "0" , "0.0000009" , false ) ,
503- ( "strictEqual" , "0" , "0.000001" , false ) ,
504- ( "strictEqual" , "0" , "1" , false ) ,
505- ( "strictEqual" , "1" , "null" , false ) ,
506- // always
507- ( "always" , "0" , "0" , true ) ,
508- ( "always" , "0" , "1" , true ) ,
509- ( "always" , "1" , "0" , true ) ,
510- ( "always" , "1" , "1" , true ) ,
511- ]
512- . into_iter ( )
513- . enumerate ( )
514- {
513+ for ( i, & ( cond, x, y, want_jump) ) in CONDITION_TESTS . iter ( ) . enumerate ( ) {
515514 let err = format ! ( "{cond} {x} {y}" ) . replace ( '"' , "'" ) ;
516515 if want_jump {
517516 code. push_str ( & format ! (
@@ -772,4 +771,44 @@ mod tests {
772771 LValue :: Number ( COLORS [ "royal" ] )
773772 ) ;
774773 }
774+
775+ #[ test]
776+ fn test_select ( ) {
777+ for & ( cond, x, y, want_true) in CONDITION_TESTS {
778+ let mut vm = single_processor_vm (
779+ BlockType :: HyperProcessor ,
780+ & format ! (
781+ "
782+ set x {x}
783+ set y {y}
784+ set if_true 0xdeadbeef
785+ set if_false 0xbabecafe
786+ select got1 {cond} x y if_true if_false
787+ select got2 {cond} {x} {y} 0xdeadbeef 0xbabecafe
788+ stop
789+ "
790+ ) ,
791+ ) ;
792+
793+ run ( & mut vm, 1 , true ) ;
794+
795+ let state = take_processor ( & mut vm, 0 ) . state ;
796+ let want_value = if want_true {
797+ 0xdeadbeefu64
798+ } else {
799+ 0xbabecafeu64
800+ }
801+ . into ( ) ;
802+ assert_eq ! (
803+ state. variables[ "got1" ] . get( & state) ,
804+ want_value,
805+ "{cond} {x} {y} (variables)"
806+ ) ;
807+ assert_eq ! (
808+ state. variables[ "got2" ] . get( & state) ,
809+ want_value,
810+ "{cond} {x} {y} (constants)"
811+ ) ;
812+ }
813+ }
775814}
0 commit comments