import { module, test } from 'qunit';
import KVObject from 'vault/lib/kv-object';

module('lib/kv-object', 'Unit | Lib | kv object');

let fromJSONTests = [
  [
    'types',
    { string: 'string', false: false, zero: 0, number: 1, null: null, true: true, object: { one: 'two' } },
    [
      { name: 'false', value: false },
      { name: 'null', value: null },
      { name: 'number', value: 1 },
      { name: 'object', value: { one: 'two' } },
      { name: 'string', value: 'string' },
      { name: 'true', value: true },
      { name: 'zero', value: 0 },
    ],
  ],
  [
    'ordering',
    { b: 'b', '1': '1', z: 'z', A: 'A', a: 'a' },
    [
      { name: '1', value: '1' },
      { name: 'a', value: 'a' },
      { name: 'A', value: 'A' },
      { name: 'b', value: 'b' },
      { name: 'z', value: 'z' },
    ],
  ],
];

fromJSONTests.forEach(function([name, input, content]) {
  test(`fromJSON: ${name}`, function(assert) {
    let data = KVObject.create({ content: [] }).fromJSON(input);
    assert.deepEqual(data.get('content'), content, 'has expected content');
  });
});

fromJSONTests.forEach(function([name, input, content]) {
  test(`fromJSONString: ${name}`, function(assert) {
    let inputString = JSON.stringify(input, null, 2);
    let data = KVObject.create({ content: [] }).fromJSONString(inputString);
    assert.deepEqual(data.get('content'), content, 'has expected content');
  });
});

let toJSONTests = [
  [
    'types',
    false,
    { string: 'string', false: false, zero: 0, number: 1, null: null, true: true, object: { one: 'two' } },
    { false: false, null: null, number: 1, object: { one: 'two' }, string: 'string', true: true, zero: 0 },
  ],
  ['include blanks = true', true, { string: 'string', '': '' }, { string: 'string', '': '' }],
  ['include blanks = false', false, { string: 'string', '': '' }, { string: 'string' }],
];

toJSONTests.forEach(function([name, includeBlanks, input, output]) {
  test(`toJSON: ${name}`, function(assert) {
    let data = KVObject.create({ content: [] }).fromJSON(input);
    let result = data.toJSON(includeBlanks);
    assert.deepEqual(result, output, 'has expected output');
  });
});

toJSONTests.forEach(function([name, includeBlanks, input, output]) {
  test(`toJSONString: ${name}`, function(assert) {
    let expected = JSON.stringify(output, null, 2);
    let data = KVObject.create({ content: [] }).fromJSON(input);
    let result = data.toJSONString(includeBlanks);
    assert.equal(result, expected, 'has expected output string');
  });
});

let isAdvancedTests = [
  [
    'advanced',
    { string: 'string', false: false, zero: 0, number: 1, null: null, true: true, object: { one: 'two' } },
    true,
  ],
  ['string-only', { string: 'string', one: 'two' }, false],
];

isAdvancedTests.forEach(function([name, input, expected]) {
  test(`isAdvanced: ${name}`, function(assert) {
    let data = KVObject.create({ content: [] }).fromJSON(input);

    assert.equal(data.isAdvanced(), expected, 'calculates isAdvanced correctly');
  });
});
