|
1 | | -import { |
2 | | - Class, |
3 | | - Constraint, |
4 | | - Domain, |
5 | | - Domains, |
6 | | - Node, |
7 | | - Query, |
8 | | - QueryRef, |
9 | | - URIRef, |
10 | | -} from '../korrel8r/types'; |
11 | | - |
12 | 1 | import * as api from '../korrel8r/client'; |
13 | 2 |
|
| 3 | +import { Class, Constraint, Domain, Domains, Graph, Node, Query, URIRef } from '../korrel8r/types'; |
| 4 | + |
14 | 5 | describe('Query', () => { |
15 | 6 | it('converts to/from string', () => { |
16 | 7 | const abc = new Class('a', 'b').query('c=d'); |
@@ -120,96 +111,75 @@ describe('URIRef', () => { |
120 | 111 | }); |
121 | 112 |
|
122 | 113 | describe('Node', () => { |
123 | | - const domains = new Domains(...['a', 'x'].map((name: string): Domain => new FakeDomain(name))); |
124 | | - |
125 | 114 | it('constructor', () => { |
126 | 115 | expect( |
127 | | - new Node( |
128 | | - { |
129 | | - class: 'a:b', |
130 | | - count: 10, |
131 | | - queries: [ |
132 | | - { query: 'a:b:c', count: 5 }, |
133 | | - { query: 'a:b:d', count: 5 }, |
134 | | - ], |
135 | | - }, |
136 | | - domains, |
137 | | - ), |
| 116 | + new Node({ |
| 117 | + class: 'a:b', |
| 118 | + count: 10, |
| 119 | + queries: [ |
| 120 | + { query: 'a:b:c', count: 5 }, |
| 121 | + { query: 'a:b:d', count: 5 }, |
| 122 | + ], |
| 123 | + }), |
138 | 124 | ).toEqual({ |
139 | | - classStr: 'a:b', |
| 125 | + api: { |
| 126 | + class: 'a:b', |
| 127 | + count: 10, |
| 128 | + queries: [ |
| 129 | + { query: 'a:b:c', count: 5 }, |
| 130 | + { query: 'a:b:d', count: 5 }, |
| 131 | + ], |
| 132 | + }, |
| 133 | + |
140 | 134 | class: { domain: 'a', name: 'b' }, |
141 | | - count: 10, |
142 | 135 | queries: [ |
143 | 136 | { |
144 | | - count: 5, |
145 | | - queryStr: 'a:b:c', |
| 137 | + queryCount: { query: 'a:b:c', count: 5 }, |
146 | 138 | query: { class: { domain: 'a', name: 'b' }, selector: 'c' }, |
147 | | - link: 'a/b?c', |
148 | 139 | }, |
149 | 140 | { |
150 | | - count: 5, |
151 | | - queryStr: 'a:b:d', |
| 141 | + queryCount: { query: 'a:b:d', count: 5 }, |
152 | 142 | query: { class: { domain: 'a', name: 'b' }, selector: 'd' }, |
153 | | - link: 'a/b?d', |
154 | 143 | }, |
155 | 144 | ], |
156 | 145 | }); |
157 | 146 | }); |
158 | 147 |
|
159 | | - it('constructor constraint', () => { |
160 | | - expect( |
161 | | - new Node( |
162 | | - { |
163 | | - class: 'a:b', |
164 | | - count: 10, |
165 | | - queries: [{ query: 'a:b:c', count: 5 }], |
166 | | - }, |
167 | | - domains, |
168 | | - new Constraint({ start, end }), |
169 | | - ), |
170 | | - ).toEqual({ |
171 | | - class: { domain: 'a', name: 'b' } as Class, |
172 | | - classStr: 'a:b', |
173 | | - count: 10, |
174 | | - queries: [ |
175 | | - { |
176 | | - count: 5, |
177 | | - queryStr: 'a:b:c', |
178 | | - query: { class: { domain: 'a', name: 'b' }, selector: 'c' } as Query, |
179 | | - link: `a/b?c&constraint={"start":"${start.toISOString()}","end":"${end.toISOString()}"}`, |
180 | | - } as QueryRef, |
181 | | - ], |
182 | | - } as Node); |
183 | | - }); |
184 | | - |
185 | | - it('constructor class mismatch', () => { |
186 | | - expect( |
187 | | - new Node({ class: 'a:b', queries: [{ query: 'a:x:c', count: 5 }], count: 1 }, domains), |
188 | | - ).toEqual({ |
189 | | - class: { domain: 'a', name: 'b' }, |
190 | | - count: 1, |
191 | | - classStr: 'a:b', |
192 | | - queries: [ |
193 | | - { |
194 | | - count: 5, |
195 | | - error: 'query a:x:c: wrong class, expected a:b', |
196 | | - query: { |
197 | | - class: { domain: 'a', name: 'x' }, |
198 | | - selector: 'c', |
199 | | - }, |
200 | | - queryStr: 'a:x:c', |
201 | | - link: 'a/x?c', |
202 | | - }, |
203 | | - ], |
204 | | - error: 'No valid links', |
205 | | - } as Node); |
206 | | - }); |
207 | | - |
208 | 148 | it('constructor bad class', () => { |
209 | | - expect(new Node({ class: 'foobar', count: 1 }, domains)).toEqual({ |
210 | | - classStr: 'foobar', |
211 | | - count: 1, |
212 | | - error: 'node foobar: invalid class: foobar', |
| 149 | + expect(new Node({ class: 'foobar', count: 1 })).toEqual({ |
| 150 | + api: { class: 'foobar', count: 1 }, |
| 151 | + error: new TypeError('invalid class: foobar'), |
| 152 | + queries: [], |
213 | 153 | }); |
214 | 154 | }); |
215 | 155 | }); |
| 156 | + |
| 157 | +describe('Graph', () => { |
| 158 | + const a: api.Graph = { |
| 159 | + nodes: [ |
| 160 | + { class: 'a:x', count: 1, queries: [{ query: 'a:x:one', count: 1 }] }, |
| 161 | + { class: 'b:y', count: 2, queries: [{ query: 'b:y:two', count: 2 }] }, |
| 162 | + { |
| 163 | + class: 'c:z', |
| 164 | + count: 4, |
| 165 | + queries: [ |
| 166 | + { query: 'c:z:one', count: 1 }, |
| 167 | + { query: 'c:z:three', count: 3 }, |
| 168 | + ], |
| 169 | + }, |
| 170 | + ], |
| 171 | + edges: [ |
| 172 | + { start: 'a:x', goal: 'b:y' }, |
| 173 | + { start: 'a:x', goal: 'c:z' }, |
| 174 | + { start: 'b:y', goal: 'c:z' }, |
| 175 | + ], |
| 176 | + }; |
| 177 | + const g = new Graph(a); |
| 178 | + g.nodes.forEach((n) => expect(g.node(n.id)).toEqual(n)); // Lookup nodes |
| 179 | + expect(g.nodes).toEqual(a.nodes.map((n) => new Node(n))); |
| 180 | + expect(g.edges).toEqual( |
| 181 | + a.edges.map((e: api.Edge) => { |
| 182 | + return { api: e, start: g.node(e.start), goal: g.node(e.goal) }; |
| 183 | + }), |
| 184 | + ); |
| 185 | +}); |
0 commit comments