|
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'); |
@@ -404,6 +404,96 @@ describe('woql queries', () => { |
404 | 404 | expect(varsArr[0]).to.be.instanceof(Var); |
405 | 405 | }); |
406 | 406 |
|
| 407 | + it('check the vars_unique method creates VarUnique instances', () => { |
| 408 | + const varsArr = WOQL.vars_unique('A', 'B', 'C'); |
| 409 | + |
| 410 | + expect(varsArr[0]).to.be.instanceof(VarUnique); |
| 411 | + expect(varsArr[1]).to.be.instanceof(VarUnique); |
| 412 | + expect(varsArr[2]).to.be.instanceof(VarUnique); |
| 413 | + }); |
| 414 | + |
| 415 | + it('check vars_unique creates unique variable names within a single call', () => { |
| 416 | + const [a, b, c] = WOQL.vars_unique('A', 'B', 'C'); |
| 417 | + |
| 418 | + // Each variable should have a unique name |
| 419 | + expect(a.name).to.not.equal(b.name); |
| 420 | + expect(b.name).to.not.equal(c.name); |
| 421 | + expect(a.name).to.not.equal(c.name); |
| 422 | + |
| 423 | + // Each should contain the base name |
| 424 | + expect(a.name).to.include('A'); |
| 425 | + expect(b.name).to.include('B'); |
| 426 | + expect(c.name).to.include('C'); |
| 427 | + }); |
| 428 | + |
| 429 | + it('check vars_unique creates unique variable names across multiple calls', () => { |
| 430 | + const [a1] = WOQL.vars_unique('X'); |
| 431 | + const [a2] = WOQL.vars_unique('X'); |
| 432 | + const [a3] = WOQL.vars_unique('X'); |
| 433 | + |
| 434 | + // Variables with the same base name should still be unique |
| 435 | + expect(a1.name).to.not.equal(a2.name); |
| 436 | + expect(a2.name).to.not.equal(a3.name); |
| 437 | + expect(a1.name).to.not.equal(a3.name); |
| 438 | + |
| 439 | + // All should contain the base name 'X' |
| 440 | + expect(a1.name).to.include('X'); |
| 441 | + expect(a2.name).to.include('X'); |
| 442 | + expect(a3.name).to.include('X'); |
| 443 | + }); |
| 444 | + |
| 445 | + it('check vars_unique appends incrementing counter', () => { |
| 446 | + // Get the current counter value by creating a variable |
| 447 | + const [v1] = WOQL.vars_unique('test'); |
| 448 | + const counter1 = v1.counter; |
| 449 | + |
| 450 | + // Next variable should have counter + 1 |
| 451 | + const [v2] = WOQL.vars_unique('test'); |
| 452 | + expect(v2.counter).to.equal(counter1 + 1); |
| 453 | + |
| 454 | + // And so on |
| 455 | + const [v3] = WOQL.vars_unique('test'); |
| 456 | + expect(v3.counter).to.equal(counter1 + 2); |
| 457 | + }); |
| 458 | + |
| 459 | + it('check vars_unique generates correct JSON with unique variable names', () => { |
| 460 | + const [a, b] = WOQL.vars_unique('myvar', 'myvar'); |
| 461 | + |
| 462 | + const jsonA = a.json(); |
| 463 | + const jsonB = b.json(); |
| 464 | + |
| 465 | + expect(jsonA).to.have.property('@type', 'Value'); |
| 466 | + expect(jsonA).to.have.property('variable'); |
| 467 | + expect(jsonB).to.have.property('@type', 'Value'); |
| 468 | + expect(jsonB).to.have.property('variable'); |
| 469 | + |
| 470 | + // Variable names in JSON should be different even with same base name |
| 471 | + expect(jsonA.variable).to.not.equal(jsonB.variable); |
| 472 | + expect(jsonA.variable).to.include('myvar'); |
| 473 | + expect(jsonB.variable).to.include('myvar'); |
| 474 | + }); |
| 475 | + |
| 476 | + it('check vars still works exactly as before (no changes)', () => { |
| 477 | + const [x, y, z] = WOQL.vars('X', 'Y', 'Z'); |
| 478 | + |
| 479 | + // Should create Var instances, not VarUnique |
| 480 | + expect(x).to.be.instanceof(Var); |
| 481 | + expect(x).to.not.be.instanceof(VarUnique); |
| 482 | + |
| 483 | + // Names should be exactly as provided |
| 484 | + expect(x.name).to.equal('X'); |
| 485 | + expect(y.name).to.equal('Y'); |
| 486 | + expect(z.name).to.equal('Z'); |
| 487 | + |
| 488 | + // Should not have counter property |
| 489 | + expect(x).to.not.have.property('counter'); |
| 490 | + |
| 491 | + // Multiple calls with same names should produce identical variable names |
| 492 | + const [x2] = WOQL.vars('X'); |
| 493 | + expect(x2.name).to.equal('X'); |
| 494 | + expect(x2.name).to.equal(x.name); |
| 495 | + }); |
| 496 | + |
407 | 497 | it('check type_of(Var,Var)', () => { |
408 | 498 | const TypeOf = WOQL.type_of('v:X', 'v:Y').json() |
409 | 499 | expect(TypeOf).to.deep.eql({ |
|
0 commit comments