@@ -46,6 +46,21 @@ mod given_interpreter {
46
46
( result, receiver. dump ( ) )
47
47
}
48
48
49
+ fn invoke (
50
+ interpreter : & mut Interpreter ,
51
+ callable : & str ,
52
+ args : Value ,
53
+ ) -> ( InterpretResult , String ) {
54
+ let mut cursor = Cursor :: new ( Vec :: < u8 > :: new ( ) ) ;
55
+ let mut receiver = CursorReceiver :: new ( & mut cursor) ;
56
+ let callable = match interpreter. eval_fragments ( & mut receiver, callable) {
57
+ Ok ( val) => val,
58
+ Err ( e) => return ( Err ( e) , receiver. dump ( ) ) ,
59
+ } ;
60
+ let result = interpreter. invoke ( & mut receiver, callable, args) ;
61
+ ( result, receiver. dump ( ) )
62
+ }
63
+
49
64
mod without_sources {
50
65
use expect_test:: expect;
51
66
use indoc:: indoc;
@@ -514,6 +529,166 @@ mod given_interpreter {
514
529
is_only_value ( & result, & output, & Value :: unit ( ) ) ;
515
530
}
516
531
532
+ #[ test]
533
+ fn interpreter_without_sources_has_no_items ( ) {
534
+ let interpreter = get_interpreter ( ) ;
535
+ let items = interpreter. user_globals ( ) ;
536
+ assert ! ( items. is_empty( ) ) ;
537
+ }
538
+
539
+ #[ test]
540
+ fn fragment_without_items_has_no_items ( ) {
541
+ let mut interpreter = get_interpreter ( ) ;
542
+ let ( result, output) = line ( & mut interpreter, "()" ) ;
543
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
544
+ let items = interpreter. source_globals ( ) ;
545
+ assert ! ( items. is_empty( ) ) ;
546
+ }
547
+
548
+ #[ test]
549
+ fn fragment_defining_items_has_items ( ) {
550
+ let mut interpreter = get_interpreter ( ) ;
551
+ let ( result, output) = line (
552
+ & mut interpreter,
553
+ indoc ! { r#"
554
+ function Foo() : Int { 2 }
555
+ function Bar() : Int { 3 }
556
+ "# } ,
557
+ ) ;
558
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
559
+ let items = interpreter. source_globals ( ) ;
560
+ assert_eq ! ( items. len( ) , 2 ) ;
561
+ // No namespace for top-level items
562
+ assert ! ( items[ 0 ] . 0 . is_empty( ) ) ;
563
+ expect ! [ [ r#"
564
+ "Foo"
565
+ "# ] ]
566
+ . assert_debug_eq ( & items[ 0 ] . 1 ) ;
567
+ // No namespace for top-level items
568
+ assert ! ( items[ 1 ] . 0 . is_empty( ) ) ;
569
+ expect ! [ [ r#"
570
+ "Bar"
571
+ "# ] ]
572
+ . assert_debug_eq ( & items[ 1 ] . 1 ) ;
573
+ }
574
+
575
+ #[ test]
576
+ fn fragment_defining_items_with_namespace_has_items ( ) {
577
+ let mut interpreter = get_interpreter ( ) ;
578
+ let ( result, output) = line (
579
+ & mut interpreter,
580
+ indoc ! { r#"
581
+ namespace Foo {
582
+ function Bar() : Int { 3 }
583
+ }
584
+ "# } ,
585
+ ) ;
586
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
587
+ let items = interpreter. source_globals ( ) ;
588
+ assert_eq ! ( items. len( ) , 1 ) ;
589
+ expect ! [ [ r#"
590
+ [
591
+ "Foo",
592
+ ]
593
+ "# ] ]
594
+ . assert_debug_eq ( & items[ 0 ] . 0 ) ;
595
+ expect ! [ [ r#"
596
+ "Bar"
597
+ "# ] ]
598
+ . assert_debug_eq ( & items[ 0 ] . 1 ) ;
599
+ }
600
+
601
+ #[ test]
602
+ fn fragments_defining_items_add_to_existing_items ( ) {
603
+ let mut interpreter = get_interpreter ( ) ;
604
+ let ( result, output) = line (
605
+ & mut interpreter,
606
+ indoc ! { r#"
607
+ function Foo() : Int { 2 }
608
+ function Bar() : Int { 3 }
609
+ "# } ,
610
+ ) ;
611
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
612
+ let items = interpreter. source_globals ( ) ;
613
+ assert_eq ! ( items. len( ) , 2 ) ;
614
+ let ( result, output) = line (
615
+ & mut interpreter,
616
+ indoc ! { r#"
617
+ function Baz() : Int { 4 }
618
+ function Qux() : Int { 5 }
619
+ "# } ,
620
+ ) ;
621
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
622
+ let items = interpreter. source_globals ( ) ;
623
+ assert_eq ! ( items. len( ) , 4 ) ;
624
+ // No namespace for top-level items
625
+ assert ! ( items[ 0 ] . 0 . is_empty( ) ) ;
626
+ expect ! [ [ r#"
627
+ "Foo"
628
+ "# ] ]
629
+ . assert_debug_eq ( & items[ 0 ] . 1 ) ;
630
+ // No namespace for top-level items
631
+ assert ! ( items[ 1 ] . 0 . is_empty( ) ) ;
632
+ expect ! [ [ r#"
633
+ "Bar"
634
+ "# ] ]
635
+ . assert_debug_eq ( & items[ 1 ] . 1 ) ;
636
+ // No namespace for top-level items
637
+ assert ! ( items[ 2 ] . 0 . is_empty( ) ) ;
638
+ expect ! [ [ r#"
639
+ "Baz"
640
+ "# ] ]
641
+ . assert_debug_eq ( & items[ 2 ] . 1 ) ;
642
+ // No namespace for top-level items
643
+ assert ! ( items[ 3 ] . 0 . is_empty( ) ) ;
644
+ expect ! [ [ r#"
645
+ "Qux"
646
+ "# ] ]
647
+ . assert_debug_eq ( & items[ 3 ] . 1 ) ;
648
+ }
649
+
650
+ #[ test]
651
+ fn invoke_callable_without_args_succeeds ( ) {
652
+ let mut interpreter = get_interpreter ( ) ;
653
+ let ( result, output) = invoke (
654
+ & mut interpreter,
655
+ "Std.Diagnostics.DumpMachine" ,
656
+ Value :: unit ( ) ,
657
+ ) ;
658
+ is_unit_with_output ( & result, & output, "STATE:\n No qubits allocated" ) ;
659
+ }
660
+
661
+ #[ test]
662
+ fn invoke_callable_with_args_succeeds ( ) {
663
+ let mut interpreter = get_interpreter ( ) ;
664
+ let ( result, output) = invoke (
665
+ & mut interpreter,
666
+ "Message" ,
667
+ Value :: String ( "Hello, World!" . into ( ) ) ,
668
+ ) ;
669
+ is_unit_with_output ( & result, & output, "Hello, World!" ) ;
670
+ }
671
+
672
+ #[ test]
673
+ fn invoke_lambda_with_capture_succeeds ( ) {
674
+ let mut interpreter = get_interpreter ( ) ;
675
+ let ( result, output) = line ( & mut interpreter, "let x = 1; let f = y -> x + y;" ) ;
676
+ is_only_value ( & result, & output, & Value :: unit ( ) ) ;
677
+ let ( result, output) = invoke ( & mut interpreter, "f" , Value :: Int ( 2 ) ) ;
678
+ is_only_value ( & result, & output, & Value :: Int ( 3 ) ) ;
679
+ }
680
+
681
+ #[ test]
682
+ fn invoke_lambda_with_capture_in_callable_expr_succeeds ( ) {
683
+ let mut interpreter = get_interpreter ( ) ;
684
+ let ( result, output) = invoke (
685
+ & mut interpreter,
686
+ "{let x = 1; let f = y -> x + y; f}" ,
687
+ Value :: Int ( 2 ) ,
688
+ ) ;
689
+ is_only_value ( & result, & output, & Value :: Int ( 3 ) ) ;
690
+ }
691
+
517
692
#[ test]
518
693
fn callables_failing_profile_validation_are_not_registered ( ) {
519
694
let mut interpreter =
@@ -1698,6 +1873,46 @@ mod given_interpreter {
1698
1873
) ;
1699
1874
}
1700
1875
1876
+ #[ test]
1877
+ fn interpreter_returns_items_from_source ( ) {
1878
+ let sources = SourceMap :: new (
1879
+ [ (
1880
+ "test" . into ( ) ,
1881
+ "namespace A {
1882
+ operation B(): Unit { }
1883
+ }
1884
+ "
1885
+ . into ( ) ,
1886
+ ) ] ,
1887
+ Some ( "A.B()" . into ( ) ) ,
1888
+ ) ;
1889
+
1890
+ let ( std_id, store) =
1891
+ crate :: compile:: package_store_with_stdlib ( TargetCapabilityFlags :: all ( ) ) ;
1892
+ let interpreter = Interpreter :: new (
1893
+ sources,
1894
+ PackageType :: Lib ,
1895
+ TargetCapabilityFlags :: all ( ) ,
1896
+ LanguageFeatures :: default ( ) ,
1897
+ store,
1898
+ & [ ( std_id, None ) ] ,
1899
+ )
1900
+ . expect ( "interpreter should be created" ) ;
1901
+
1902
+ let items = interpreter. user_globals ( ) ;
1903
+ assert_eq ! ( 1 , items. len( ) ) ;
1904
+ expect ! [ [ r#"
1905
+ [
1906
+ "A",
1907
+ ]
1908
+ "# ] ]
1909
+ . assert_debug_eq ( & items[ 0 ] . 0 ) ;
1910
+ expect ! [ [ r#"
1911
+ "B"
1912
+ "# ] ]
1913
+ . assert_debug_eq ( & items[ 0 ] . 1 ) ;
1914
+ }
1915
+
1701
1916
#[ test]
1702
1917
fn interpreter_can_be_created_from_ast ( ) {
1703
1918
let sources = SourceMap :: new (
0 commit comments