UNPKG

d2-ui

Version:
105 lines (86 loc) 2.89 kB
/** * Copyright 2013-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * * @emails sema@fb.com */ /*jshint evil:true*/ require('mock-modules').autoMockOff(); describe('es7-rest-property-visitors', function() { var transformFn; var visitors; beforeEach(function() { require('mock-modules').dumpCache(); transformFn = require('../../src/jstransform').transform; visitors = require('../es6-destructuring-visitors').visitorList; }); function transform(code) { var lines = Array.prototype.join.call(arguments, '\n'); return transformFn(visitors, lines).code; } // Semantic tests. it('picks off remaining properties from an object', function() { var code = transform( '({ x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 });', '([ x, y, z ]);' ); expect(eval(code)).toEqual([1, 2, { a: 3, b: 4 }]); }); it('picks off remaining properties from a nested object', function() { var code = transform( 'var complex = {', ' x: { a: 1, b: 2, c: 3 },', ' y: [4, 5, 6]', '};', 'var {', ' x: { a: xa, ...xbc },', ' y: [y0, ...y12]', '} = complex;', '([ xa, xbc, y0, y12 ]);' ); expect(eval(code)).toEqual([ 1, { b: 2, c: 3 }, 4, [5, 6] ]); }); it('only extracts own properties', function() { var code = transform( 'var obj = Object.create({ x: 1 });', 'obj.y = 2;', '({ ...y } = obj);', '(y);' ); expect(eval(code)).toEqual({ y: 2 }); }); it('only extracts own properties, except when they are explicit', function() { var code = transform( 'var obj = Object.create({ x: 1, y: 2 });', 'obj.z = 3;', '({ y, ...z } = obj);', '([ y, z ]);' ); expect(eval(code)).toEqual([ 2, { z: 3 } ]); }); it('avoids passing extra properties when they are picked off', function() { var code = transform( 'function base({ a, b, x }) { return [ a, b, x ]; }', 'function wrapper({ x, y, ...restConfig }) {', ' return base(restConfig);', '}', 'wrapper({ x: 1, y: 2, a: 3, b: 4 });' ); expect(eval(code)).toEqual([ 3, 4, undefined ]); }); // Syntax tests. it('throws on leading rest properties', function () { expect(() => transform('({ ...x, y, z } = obj)')).toThrow(); }); it('throws on multiple rest properties', function () { expect(() => transform('({ x, ...y, ...z } = obj)')).toThrow(); }); // TODO: Ideally identifier reuse should fail to transform // it('throws on identifier reuse', function () { // expect(() => transform('({ x: { ...z }, y: { ...z } } = obj)')).toThrow(); // }); });