Newer
Older
reroad-test / 2020-ryusei / aframe-master / tests / utils / objects.test.js
@ryusei ryusei on 22 Oct 2020 4 KB パノラマ表示
/* global assert, suite, test */
var utils = require('index').utils;

var diff = utils.diff;
var deepEqual = utils.deepEqual;

suite('utils.objects', function () {
  suite('diff', function () {
    test('can diff identical objects', function () {
      var objA = { scale: {x: 1, y: 2, z: 3}, width: 10 };
      var objB = { scale: {x: 1, y: 2, z: 3}, width: 10 };
      assert.shallowDeepEqual(diff(objA, objB), {});
    });

    test('can diff nested objects', function () {
      var objA = { position: {x: 1, y: 2, z: 3} };
      var objB = { position: {x: 4, y: 5, z: 6} };
      assert.shallowDeepEqual(diff(objA, objB), {
        position: objB.position
      });
    });

    test('can diff primitives', function () {
      var objA = {height: 10};
      var objB = {height: 20};
      assert.shallowDeepEqual(diff(objA, objB), {
        height: 20
      });
    });

    test('can diff when key exists in A but not in B', function () {
      var objA = {primitive: 'sphere'};
      var objB = {};
      assert.shallowDeepEqual(diff(objA, objB), {
        primitive: undefined
      });
    });

    test('can diff when key exists in B but not in A', function () {
      var objA = {};
      var objB = {primitive: 'sphere'};
      assert.shallowDeepEqual(diff(objA, objB), {
        primitive: 'sphere'
      });
    });

    test('can cross-diff existing keys', function () {
      var objA = {metallic: 0.5};
      var objB = {roughness: 1};
      assert.shallowDeepEqual(diff(objA, objB), {
        metallic: undefined,
        roughness: 1
      });
    });
  });

  suite('deepEqual', function () {
    test('can compare identical objects', function () {
      var objA = {id: 62, label: 'Foo', parent: null};
      var objB = {id: 62, label: 'Foo', parent: null};
      assert.ok(deepEqual(objA, objB));
    });

    test('can compare strings', function () {
      var valA = 'abc';
      var valB = 'abc';
      var valC = 'def';
      assert.ok(deepEqual(valA, valB));
      assert.notOk(deepEqual(valA, valC));
    });

    test('can compare numbers', function () {
      var valA = 1;
      var valB = 1;
      var valC = 2;
      assert.ok(deepEqual(valA, valB));
      assert.notOk(deepEqual(valA, valC));
    });

    test('can compare for missing properties', function () {
      var objA = {id: 62, label: 'Foo', parent: null};
      var objB = {id: 62, label: 'Foo', parent: null, extraProp: true};
      assert.notOk(deepEqual(objA, objB));
    });

    test('can compare for differing property values', function () {
      var objA = {id: 62, label: 'Foo', parent: null, extraProp: false};
      var objB = {id: 62, label: 'Foo', parent: null, extraProp: true};
      assert.notOk(deepEqual(objA, objB));
    });

    test('can compare nested arrays', function () {
      var objA = {children: [1, 2, 3, 4]};
      var objB = {children: [1, 2, 3, 4]};
      var objC = {children: [1, 2, 3, 5]};
      assert.ok(deepEqual(objA, objB));
      assert.notOk(deepEqual(objA, objC));
    });

    test('can compare nested objects', function () {
      var objA = {metadata: {source: 'Wikipedia, 2016'}};
      var objB = {metadata: {source: 'Wikipedia, 2016'}};
      var objC = {metadata: {source: 'Nature, 2015'}};
      assert.ok(deepEqual(objA, objB));
      assert.notOk(deepEqual(objA, objC));
    });

    test('can compare vec3s', function () {
      var objA = {x: 0, y: 0, z: 0};
      var objB = {x: 0, y: 0, z: 0};
      var objC = {x: 1, y: 2, z: 3};
      assert.ok(deepEqual(objA, objB));
      assert.notOk(deepEqual(objA, objC));
    });

    test('can compare with null', function () {
      assert.ok(deepEqual(null, null));
      assert.notOk(deepEqual(null, {}));
    });

    test('can compare empty objects', function () {
      assert.ok(deepEqual({}, {}));
      assert.notOk(deepEqual({}, {a: 1}));
    });

    test('can compare the same object with self reference', function () {
      var objA = {x: 0, y: 0, z: 0, self: objA};
      assert.ok(deepEqual(objA, objA));
    });

    test('avoid deep equal of object that are not instantiated' +
         'with the Object constructor in order to avoid infinite loops', function () {
      assert.notOk(deepEqual(document.createElement('a-entity'),
                             document.createElement('a-entity')));
    });

    test('can compare if any of the arguments is undefined', function () {
      assert.notOk(deepEqual(undefined, {a: 1, b: 2}));
      assert.notOk(deepEqual({a: 1, b: 2}, undefined));
      assert.ok(deepEqual(undefined, undefined));
    });
  });
});