microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v1.29.0

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

source/compiler/qsc_circuit/src/operations/tests.rs

156lines · modecode

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use super::*;
5use expect_test::expect;
6use qsc_data_structures::{
7 functors::FunctorApp, language_features::LanguageFeatures, source::SourceMap,
8 target::TargetCapabilityFlags,
9};
10use qsc_frontend::compile::{PackageStore, compile, core, std};
11use qsc_hir::hir::{Item, ItemKind};
12
13fn compile_one_operation(code: &str) -> (Item, String) {
14 let core_pkg = core();
15 let mut store = PackageStore::new(core_pkg);
16 let std = std(&store, TargetCapabilityFlags::empty());
17 let std = store.insert(std);
18
19 let sources = SourceMap::new([("test".into(), code.into())], None);
20 let unit = compile(
21 &store,
22 &[(std, None)],
23 sources,
24 TargetCapabilityFlags::empty(),
25 LanguageFeatures::default(),
26 );
27 let mut callables = unit.package.items.values().filter_map(|i| {
28 if let ItemKind::Callable(decl) = &i.kind {
29 Some((i, decl.name.name.clone()))
30 } else {
31 None
32 }
33 });
34 let mut namespaces = unit.package.items.values().filter_map(|i| {
35 if let ItemKind::Namespace(ident, _) = &i.kind {
36 Some(ident.clone())
37 } else {
38 None
39 }
40 });
41 let (only_callable, callable_name) = callables.next().expect("Expected exactly one callable");
42 assert!(callables.next().is_none(), "Expected exactly one callable");
43 let only_namespace = namespaces.next().expect("Expected exactly one namespace");
44 assert!(
45 namespaces.next().is_none(),
46 "Expected exactly one namespace"
47 );
48 (
49 only_callable.clone(),
50 format!("{}.{callable_name}", only_namespace.name()),
51 )
52}
53
54#[test]
55fn no_params() {
56 let (item, operation) = compile_one_operation(
57 r"
58 namespace Test {
59 operation Test() : Result[] {
60 }
61 }
62 ",
63 );
64 let expr = entry_expr_for_qubit_operation(&item, FunctorApp::default(), &operation);
65 expect![[r#"
66 Ok(
67 "{\n use qs = Qubit[0];\n (Test.Test)();\n let r: Result[] = [];\n r\n }",
68 )
69 "#]]
70 .assert_debug_eq(&expr);
71}
72
73#[test]
74fn non_qubit_params() {
75 let (item, operation) = compile_one_operation(
76 r"
77 namespace Test {
78 operation Test(q1: Qubit, q2: Qubit, i: Int) : Result[] {
79 }
80 }
81 ",
82 );
83 let expr = entry_expr_for_qubit_operation(&item, FunctorApp::default(), &operation);
84 expect![[r#"
85 Err(
86 NoQubitParameters,
87 )
88 "#]]
89 .assert_debug_eq(&expr);
90}
91
92#[test]
93fn non_qubit_array_param() {
94 let (item, operation) = compile_one_operation(
95 r"
96 namespace Test {
97 operation Test(q1: Qubit[], q2: Qubit[][], i: Int[]) : Result[] {
98 }
99 }
100 ",
101 );
102 let expr = entry_expr_for_qubit_operation(&item, FunctorApp::default(), &operation);
103 expect![[r#"
104 Err(
105 NoQubitParameters,
106 )
107 "#]]
108 .assert_debug_eq(&expr);
109}
110
111#[test]
112fn qubit_params() {
113 let (item, operation) = compile_one_operation(
114 r"
115 namespace Test {
116 operation Test(q1: Qubit, q2: Qubit) : Result[] {
117 }
118 }
119 ",
120 );
121
122 let expr = entry_expr_for_qubit_operation(&item, FunctorApp::default(), &operation)
123 .expect("expression expected");
124
125 expect![[r"
126 {
127 use qs = Qubit[2];
128 (Test.Test)(qs[0], qs[1]);
129 let r: Result[] = [];
130 r
131 }"]]
132 .assert_eq(&expr);
133}
134
135#[test]
136fn qubit_array_params() {
137 let (item, operation) = compile_one_operation(
138 r"
139 namespace Test {
140 operation Test(q1: Qubit[], q2: Qubit[][], q3: Qubit[][][], q: Qubit) : Result[] {
141 }
142 }
143 ",
144 );
145
146 let expr = entry_expr_for_qubit_operation(&item, FunctorApp::default(), &operation)
147 .expect("expression expected");
148
149 expect![[r"
150 {
151 use qs = Qubit[15];
152 (Test.Test)(qs[0..1], Microsoft.Quantum.Arrays.Chunks(2, qs[2..5]), Microsoft.Quantum.Arrays.Chunks(2, Microsoft.Quantum.Arrays.Chunks(2, qs[6..13])), qs[14]);
153 let r: Result[] = [];
154 r
155 }"]].assert_eq(&expr);
156}