import { seedTokens, rewireSource, rewireSpecs } from '../../src/util.js';

test('source to spec', () => {
  const block = {
    description: '',
    tags: [
      {
        tag: 'my-tag',
        name: '',
        type: '',
        optional: false,
        description: '',
        problems: [],
        source: [
          {
            number: 2,
            source: '...changed in spec...',
            tokens: seedTokens({ name: '...changed in spec...' }),
          },
        ],
      },
    ],
    source: [
      {
        number: 1,
        source: 'source line 1',
        tokens: seedTokens(),
      },
      {
        number: 2,
        source: 'source line 2',
        tokens: seedTokens({ name: 'source' }),
      },
    ],
    problems: [],
  };

  // source is unsynced
  expect(block.source[1] === block.tags[0].source[0]).toBe(false);

  rewireSource(block);

  // source is referenced
  expect(block.source[1] === block.tags[0].source[0]).toBe(true);

  // non-tag line stays unchanged
  expect(block.source[0].source).toEqual('source line 1');
  // tag-holding source line stays unchanged
  expect(block.source[1].source).toEqual('source line 2');
  expect(block.source[1].tokens.name).toEqual('source');
  // tag source inherits block source
  expect(block.tags[0].source[0].source).toEqual('source line 2');
  expect(block.tags[0].source[0].tokens.name).toEqual('source');
});

test('spec to source', () => {
  const block = {
    description: '',
    tags: [
      {
        tag: 'my-tag',
        name: '',
        type: '',
        optional: false,
        description: '',
        problems: [],
        source: [
          {
            number: 2,
            source: '...changed in spec...',
            tokens: seedTokens({ name: '...changed in spec...' }),
          },
        ],
      },
    ],
    source: [
      {
        number: 1,
        source: 'source line 1',
        tokens: seedTokens(),
      },
      {
        number: 2,
        source: 'source line 2',
        tokens: seedTokens({ name: 'source' }),
      },
    ],
    problems: [],
  };

  // source is unsynced
  expect(block.source[1] === block.tags[0].source[0]).toBe(false);

  rewireSpecs(block);

  // source is referenced
  expect(block.source[1] === block.tags[0].source[0]).toBe(true);

  // non-tag line stays unchanged
  expect(block.source[0].source).toEqual('source line 1');
  // tag-holding source line inherits spec source
  expect(block.source[1].source).toEqual('...changed in spec...');
  expect(block.source[1].tokens.name).toEqual('...changed in spec...');
  // tag source inherits block source
  expect(block.tags[0].source[0].source).toEqual('...changed in spec...');
  expect(block.tags[0].source[0].tokens.name).toEqual('...changed in spec...');
});