UNPKG

vuetify

Version:

Vue Material Component Framework

365 lines (298 loc) 14.9 kB
import Vue from 'vue/dist/vue.common.js' import { deepEqual, getNestedValue, getPropertyFromItem, convertToUnit, getSlotType, arrayDiff, getObjectValueByPath, humanReadableFileSize, sortItems, } from '../helpers' describe('helpers', () => { it('should return set difference of arrays A and B', () => { expect(arrayDiff(['one', 'two'], ['one'])).toEqual([]) expect(arrayDiff(['one'], ['one', 'two'])).toEqual(['two']) expect(arrayDiff([], [])).toEqual([]) expect(arrayDiff([], ['one'])).toEqual(['one']) expect(arrayDiff(['one'], ['two'])).toEqual(['two']) expect(arrayDiff(['one', 'two'], ['one', 'three'])).toEqual(['three']) }) it('should pass comparison', () => { // eslint-disable-line max-statements // Null expect(deepEqual(null, null)).toEqual(true) expect(deepEqual(null, undefined)).toEqual(false) expect(deepEqual(null, false)).toEqual(false) expect(deepEqual(null, 0)).toEqual(false) expect(deepEqual(null, '')).toEqual(false) expect(deepEqual(null, [])).toEqual(false) expect(deepEqual(null, {})).toEqual(false) // Undefined expect(deepEqual(undefined, undefined)).toEqual(true) expect(deepEqual(undefined, null)).toEqual(false) expect(deepEqual(undefined, false)).toEqual(false) expect(deepEqual(undefined, 0)).toEqual(false) expect(deepEqual(undefined, '')).toEqual(false) expect(deepEqual(undefined, [])).toEqual(false) expect(deepEqual(undefined, {})).toEqual(false) // Boolean expect(deepEqual(true, true)).toEqual(true) expect(deepEqual(true, false)).toEqual(false) expect(deepEqual(true, undefined)).toEqual(false) expect(deepEqual(true, null)).toEqual(false) expect(deepEqual(true, 0)).toEqual(false) expect(deepEqual(true, 1)).toEqual(false) expect(deepEqual(true, '')).toEqual(false) expect(deepEqual(true, 'abc')).toEqual(false) expect(deepEqual(true, [1, 2])).toEqual(false) expect(deepEqual(true, { x: 1 })).toEqual(false) expect(deepEqual(false, false)).toEqual(true) expect(deepEqual(false, true)).toEqual(false) expect(deepEqual(false, undefined)).toEqual(false) expect(deepEqual(false, null)).toEqual(false) expect(deepEqual(false, 0)).toEqual(false) expect(deepEqual(false, 1)).toEqual(false) expect(deepEqual(false, '')).toEqual(false) expect(deepEqual(false, 'abc')).toEqual(false) expect(deepEqual(false, [1, 2])).toEqual(false) expect(deepEqual(false, { x: 1 })).toEqual(false) // Number expect(deepEqual(5, 5)).toEqual(true) expect(deepEqual(8, 8.0)).toEqual(true) expect(deepEqual(8, '8')).toEqual(false) expect(deepEqual(-10, -10)).toEqual(true) expect(deepEqual(0, '')).toEqual(false) expect(deepEqual(0, false)).toEqual(false) expect(deepEqual(0, null)).toEqual(false) expect(deepEqual(0, undefined)).toEqual(false) // String expect(deepEqual('', '')).toEqual(true) expect(deepEqual('a', 'a')).toEqual(true) expect(deepEqual('a', 'b')).toEqual(false) expect(deepEqual('a', 'A')).toEqual(false) expect(deepEqual('abc', 'abc')).toEqual(true) expect(deepEqual('Abc', 'abc')).toEqual(false) expect(deepEqual(' ', '')).toEqual(false) // Array expect(deepEqual([], [])).toEqual(true) expect(deepEqual([1], [1.0])).toEqual(true) expect(deepEqual([1, '2'], [1, '2'])).toEqual(true) expect(deepEqual([1, { x: 1, y: 2 }], [1, { x: 1, y: 2 }])).toEqual(true) expect(deepEqual([1, { x: 1, y: null }], [1, { x: 1, y: false }])).toEqual(false) expect(deepEqual([1, [1, 2]], [1, [1, 2]])).toEqual(true) // Object expect(deepEqual({}, {})).toEqual(true) expect(deepEqual({ x: 1 }, { x: 1 })).toEqual(true) expect(deepEqual({ x: 1 }, {})).toEqual(false) expect(deepEqual({ x: { a: 1, b: 2 } }, { x: { a: 1, b: 2 } })).toEqual(true) // Date const currentDate = new Date() const futureDate = new Date(1000) expect(deepEqual(currentDate, currentDate)).toEqual(true) expect(deepEqual({ date: currentDate }, { date: currentDate })).toEqual(true) expect(deepEqual(currentDate, futureDate)).toEqual(false) expect(deepEqual({ date: currentDate }, { date: futureDate })).toEqual(false) const circular = {} // eslint-disable-line sonarjs/prefer-object-literal circular.me = circular expect(deepEqual({ r: circular }, { r: circular })).toEqual(true) expect(deepEqual({ r: circular, x: 1 }, { r: circular, x: 2 })).toEqual(false) expect(deepEqual({ r: [circular] }, { r: [circular] })).toEqual(true) }) it('should get value directly on object if not undefined', () => { const obj = { a: 'foo', 'b.a': 'foobar', b: { a: 1, }, 'c.d': undefined, c: { d: 'bar', }, } expect(getObjectValueByPath(obj, 'a')).toEqual('foo') expect(getObjectValueByPath(obj, 'b.a')).toEqual('foobar') expect(getObjectValueByPath(obj, 'c.d')).toEqual('bar') }) it('should get nested value', () => { const obj = { a: { b: { c: 1, d: 2, }, e: [ { f: 'f' }, 'e1', ], }, g: null, } expect(getNestedValue(obj, ['a', 'b', 'c'])).toEqual(1) expect(getNestedValue(obj, ['a', 'b', 'd'])).toEqual(2) expect(getNestedValue(obj, ['a', 'b'])).toEqual({ c: 1, d: 2 }) expect(getNestedValue(obj, ['a', 'e', '0', 'f'])).toEqual('f') expect(getNestedValue(obj, ['a', 'e', 0, 'f'])).toEqual('f') expect(getNestedValue(obj, ['a', 'e', '1'])).toEqual('e1') expect(getNestedValue(obj, ['g'])).toBeNull() expect(getNestedValue(obj, ['missing', 'key'])).toBeUndefined() const arr = ['val', obj] expect(getNestedValue(arr, ['1', 'a', 'b', 'c'])).toEqual(1) expect(getNestedValue(arr, ['1', 'a', 'e', 0, 'f'])).toEqual('f') expect(getNestedValue(arr, [0])).toEqual('val') expect(getNestedValue(arr, [1])).toEqual(obj) expect(getNestedValue('str', [])).toEqual('str') expect(getNestedValue(5, [])).toEqual(5) expect(getNestedValue(null, [])).toBeNull() expect(getNestedValue(null, ['a'])).toBeUndefined() }) it('should get property from items', () => { const obj = { a: { b: 1, }, c: [2, 3, { d: 'd' }], 'x.y': 'comp', x: { y: 'nested', }, } expect(getPropertyFromItem(obj, 'a.b')).toEqual(1) expect(getPropertyFromItem(obj, 'c.0')).toEqual(2) expect(getPropertyFromItem(obj, 'c.2.d')).toEqual('d') expect(getPropertyFromItem(obj, 'c.2.d.x', 'fallback')).toEqual('fallback') expect(getPropertyFromItem(obj, o => o.a.b + o.c[0])).toEqual(3) expect(getPropertyFromItem(obj, ['c', 2, 'd'])).toEqual('d') expect(getPropertyFromItem(obj, 'x.y')).toEqual('comp') expect(getPropertyFromItem(obj, ['x', 'y'])).toEqual('nested') expect(getPropertyFromItem(obj, ['x.y'])).toEqual('comp') }) it('should return proper value in convertToUnit', () => { expect(convertToUnit(undefined)).toBeUndefined() expect(convertToUnit(null)).toBeUndefined() expect(convertToUnit('')).toBeUndefined() expect(convertToUnit(0)).toBe('0px') expect(convertToUnit(3)).toBe('3px') expect(convertToUnit(3.14)).toBe('3.14px') expect(convertToUnit(0, 'em')).toBe('0em') expect(convertToUnit(3, 'em')).toBe('3em') expect(convertToUnit(3.14, 'em')).toBe('3.14em') expect(convertToUnit('0vw')).toBe('0vw') expect(convertToUnit('3vw')).toBe('3vw') expect(convertToUnit('3.14vw')).toBe('3.14vw') expect(convertToUnit('foo')).toBe('foo') }) describe('getSlotType', () => { it('should detect old slots', () => { const vm = new Vue({ components: { foo: { render: h => h('div') }, }, template: `<foo ref="foo"><template slot="bar">hello</template></foo>`, }).$mount() expect(getSlotType(vm.$refs.foo, 'bar')).toBe('normal') }) it('should detect old scoped slots', () => { const vm = new Vue({ components: { foo: { render: h => h('div') }, }, template: `<foo ref="foo"><template slot="bar" slot-scope="data">hello</template></foo>`, }).$mount() expect(getSlotType(vm.$refs.foo, 'bar')).toBe('scoped') }) it('should detect bare v-slot', () => { const vm = new Vue({ components: { foo: { render: h => h('div') }, }, template: `<foo ref="foo"><template #bar>hello</template></foo>`, }).$mount() expect(getSlotType(vm.$refs.foo, 'bar', true)).toBe('v-slot') }) it('should detect bound v-slot', () => { const vm = new Vue({ components: { foo: { render: h => h('div') }, }, template: `<foo ref="foo"><template #bar="data">hello</template></foo>`, }).$mount() expect(getSlotType(vm.$refs.foo, 'bar', true)).toBe('scoped') }) it('should count bare v-slot as scoped', () => { const vm = new Vue({ components: { foo: { render: h => h('div') }, }, template: `<foo ref="foo"><template #bar>hello</template></foo>`, }).$mount() expect(getSlotType(vm.$refs.foo, 'bar')).toBe('scoped') }) }) it('humanReadableFileSize should format file sizes with base 1024', () => { expect(humanReadableFileSize(0, true)).toBe('0 B') expect(humanReadableFileSize(512, true)).toBe('512 B') expect(humanReadableFileSize(1024, true)).toBe('1.0 KiB') expect(humanReadableFileSize(4096, true)).toBe('4.0 KiB') expect(humanReadableFileSize(1048576, true)).toBe('1.0 MiB') expect(humanReadableFileSize(2097152, true)).toBe('2.0 MiB') expect(humanReadableFileSize(1073741824, true)).toBe('1.0 GiB') expect(humanReadableFileSize(2147483648, true)).toBe('2.0 GiB') }) it('humanReadableFileSize should format file sizes with base 1000', () => { expect(humanReadableFileSize(0)).toBe('0 B') expect(humanReadableFileSize(512)).toBe('512 B') expect(humanReadableFileSize(1000)).toBe('1.0 kB') expect(humanReadableFileSize(4000)).toBe('4.0 kB') expect(humanReadableFileSize(1000000)).toBe('1.0 MB') expect(humanReadableFileSize(2000000)).toBe('2.0 MB') expect(humanReadableFileSize(1000000000)).toBe('1.0 GB') expect(humanReadableFileSize(2000000000)).toBe('2.0 GB') }) it('should sort items by single column', () => { let items const getItems = () => [{ string: 'foo', number: 1 }, { string: 'bar', number: 2 }, { string: 'baz', number: 4 }, { string: 'fizzbuzz', number: 3 }] sortItems(items = getItems(), ['string'], [], 'en') expect(items).toStrictEqual([{ string: 'bar', number: 2 }, { string: 'baz', number: 4 }, { string: 'fizzbuzz', number: 3 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['string'], [true], 'en') expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'fizzbuzz', number: 3 }, { string: 'baz', number: 4 }, { string: 'bar', number: 2 }]) sortItems(items = getItems(), ['number'], [], 'en') expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'bar', number: 2 }, { string: 'fizzbuzz', number: 3 }, { string: 'baz', number: 4 }]) sortItems(items = getItems(), ['number'], [true], 'en') expect(items).toStrictEqual([{ string: 'baz', number: 4 }, { string: 'fizzbuzz', number: 3 }, { string: 'bar', number: 2 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['number'], [], 'en', { number: (a, b) => b - a }) expect(items).toStrictEqual([{ string: 'baz', number: 4 }, { string: 'fizzbuzz', number: 3 }, { string: 'bar', number: 2 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['number'], [true], 'en', { number: (a, b) => b - a }) expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'bar', number: 2 }, { string: 'fizzbuzz', number: 3 }, { string: 'baz', number: 4 }]) }) it('should sort items with deep structure', () => { const items = [{ foo: { bar: { baz: 3 } } }, { foo: { bar: { baz: 1 } } }, { foo: { bar: { baz: 2 } } }] sortItems(items, ['foo.bar.baz'], [], 'en') expect(items).toStrictEqual([{ foo: { bar: { baz: 1 } } }, { foo: { bar: { baz: 2 } } }, { foo: { bar: { baz: 3 } } }]) }) it('should sort items by multiple columns', () => { let items const getItems = () => [{ string: 'foo', number: 1 }, { string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }] sortItems(items = getItems(), ['string', 'number'], [], 'en') expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 1 }, { string: 'baz', number: 2 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['string', 'number'], [true, false], 'en') expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'baz', number: 1 }, { string: 'baz', number: 2 }, { string: 'bar', number: 3 }]) sortItems(items = getItems(), ['string', 'number'], [false, true], 'en') expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['string', 'number'], [true, true], 'en') expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }, { string: 'bar', number: 3 }]) sortItems(items = getItems(), ['number', 'string'], [], 'en') expect(items).toStrictEqual([{ string: 'baz', number: 1 }, { string: 'foo', number: 1 }, { string: 'baz', number: 2 }, { string: 'bar', number: 3 }]) sortItems(items = getItems(), ['number', 'string'], [true, false], 'en') expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['number', 'string'], [false, true], 'en') expect(items).toStrictEqual([{ string: 'foo', number: 1 }, { string: 'baz', number: 1 }, { string: 'baz', number: 2 }, { string: 'bar', number: 3 }]) sortItems(items = getItems(), ['number', 'string'], [true, true], 'en') expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'foo', number: 1 }, { string: 'baz', number: 1 }]) sortItems(items = getItems(), ['string', 'number'], [], 'en', { number: (a, b) => b - a }) expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }, { string: 'foo', number: 1 }]) sortItems(items = getItems(), ['number', 'string'], [], 'en', { number: (a, b) => b - a }) expect(items).toStrictEqual([{ string: 'bar', number: 3 }, { string: 'baz', number: 2 }, { string: 'baz', number: 1 }, { string: 'foo', number: 1 }]) }) })