|
1 | 1 | const { expect } = require('chai'); |
2 | 2 |
|
3 | 3 | const WOQL = require('../lib/woql'); |
4 | | -const { Var, Vars } = require('../lib/query/woqlDoc'); |
| 4 | +const { Var, VarUnique, Vars } = require('../lib/query/woqlDoc'); |
5 | 5 |
|
6 | 6 | const idGenJson = require('./woqlJson/woqlIdgenJson'); |
7 | 7 | const woqlStarJson = require('./woqlJson/woqlStarJson'); |
@@ -376,6 +376,96 @@ describe('woql queries', () => { |
376 | 376 | expect(varsArr[0]).to.be.instanceof(Var); |
377 | 377 | }); |
378 | 378 |
|
| 379 | + it('check the vars_unique method creates VarUnique instances', () => { |
| 380 | + const varsArr = WOQL.vars_unique('A', 'B', 'C'); |
| 381 | + |
| 382 | + expect(varsArr[0]).to.be.instanceof(VarUnique); |
| 383 | + expect(varsArr[1]).to.be.instanceof(VarUnique); |
| 384 | + expect(varsArr[2]).to.be.instanceof(VarUnique); |
| 385 | + }); |
| 386 | + |
| 387 | + it('check vars_unique creates unique variable names within a single call', () => { |
| 388 | + const [a, b, c] = WOQL.vars_unique('A', 'B', 'C'); |
| 389 | + |
| 390 | + // Each variable should have a unique name |
| 391 | + expect(a.name).to.not.equal(b.name); |
| 392 | + expect(b.name).to.not.equal(c.name); |
| 393 | + expect(a.name).to.not.equal(c.name); |
| 394 | + |
| 395 | + // Each should contain the base name |
| 396 | + expect(a.name).to.include('A'); |
| 397 | + expect(b.name).to.include('B'); |
| 398 | + expect(c.name).to.include('C'); |
| 399 | + }); |
| 400 | + |
| 401 | + it('check vars_unique creates unique variable names across multiple calls', () => { |
| 402 | + const [a1] = WOQL.vars_unique('X'); |
| 403 | + const [a2] = WOQL.vars_unique('X'); |
| 404 | + const [a3] = WOQL.vars_unique('X'); |
| 405 | + |
| 406 | + // Variables with the same base name should still be unique |
| 407 | + expect(a1.name).to.not.equal(a2.name); |
| 408 | + expect(a2.name).to.not.equal(a3.name); |
| 409 | + expect(a1.name).to.not.equal(a3.name); |
| 410 | + |
| 411 | + // All should contain the base name 'X' |
| 412 | + expect(a1.name).to.include('X'); |
| 413 | + expect(a2.name).to.include('X'); |
| 414 | + expect(a3.name).to.include('X'); |
| 415 | + }); |
| 416 | + |
| 417 | + it('check vars_unique appends incrementing counter', () => { |
| 418 | + // Get the current counter value by creating a variable |
| 419 | + const [v1] = WOQL.vars_unique('test'); |
| 420 | + const counter1 = v1.counter; |
| 421 | + |
| 422 | + // Next variable should have counter + 1 |
| 423 | + const [v2] = WOQL.vars_unique('test'); |
| 424 | + expect(v2.counter).to.equal(counter1 + 1); |
| 425 | + |
| 426 | + // And so on |
| 427 | + const [v3] = WOQL.vars_unique('test'); |
| 428 | + expect(v3.counter).to.equal(counter1 + 2); |
| 429 | + }); |
| 430 | + |
| 431 | + it('check vars_unique generates correct JSON with unique variable names', () => { |
| 432 | + const [a, b] = WOQL.vars_unique('myvar', 'myvar'); |
| 433 | + |
| 434 | + const jsonA = a.json(); |
| 435 | + const jsonB = b.json(); |
| 436 | + |
| 437 | + expect(jsonA).to.have.property('@type', 'Value'); |
| 438 | + expect(jsonA).to.have.property('variable'); |
| 439 | + expect(jsonB).to.have.property('@type', 'Value'); |
| 440 | + expect(jsonB).to.have.property('variable'); |
| 441 | + |
| 442 | + // Variable names in JSON should be different even with same base name |
| 443 | + expect(jsonA.variable).to.not.equal(jsonB.variable); |
| 444 | + expect(jsonA.variable).to.include('myvar'); |
| 445 | + expect(jsonB.variable).to.include('myvar'); |
| 446 | + }); |
| 447 | + |
| 448 | + it('check vars still works exactly as before (no changes)', () => { |
| 449 | + const [x, y, z] = WOQL.vars('X', 'Y', 'Z'); |
| 450 | + |
| 451 | + // Should create Var instances, not VarUnique |
| 452 | + expect(x).to.be.instanceof(Var); |
| 453 | + expect(x).to.not.be.instanceof(VarUnique); |
| 454 | + |
| 455 | + // Names should be exactly as provided |
| 456 | + expect(x.name).to.equal('X'); |
| 457 | + expect(y.name).to.equal('Y'); |
| 458 | + expect(z.name).to.equal('Z'); |
| 459 | + |
| 460 | + // Should not have counter property |
| 461 | + expect(x).to.not.have.property('counter'); |
| 462 | + |
| 463 | + // Multiple calls with same names should produce identical variable names |
| 464 | + const [x2] = WOQL.vars('X'); |
| 465 | + expect(x2.name).to.equal('X'); |
| 466 | + expect(x2.name).to.equal(x.name); |
| 467 | + }); |
| 468 | + |
379 | 469 | it('check type_of(Var,Var)', () => { |
380 | 470 | const TypeOf = WOQL.type_of('v:X', 'v:Y').json() |
381 | 471 | expect(TypeOf).to.deep.eql({ |
|
0 commit comments