| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| // import { Dictionary } from 'zrender/src/core/types'; | |
| import { mergeLayoutParam } from '@/src/util/layout'; | |
| import { BoxLayoutOptionMixin } from '@/src/util/types'; | |
| describe('util/number', function () { | |
| describe('mergeLayoutParam', function () { | |
| // The given obj has exactly the given props, has no other props. | |
| function expectPropsEqual(obj: object, props: object): void { | |
| expect(propContain(obj, props) && propContain(props, obj)).toEqual(true); | |
| } | |
| function propContain(more: object, less: object): boolean { | |
| for (const key in more) { | |
| if (more.hasOwnProperty(key)) { | |
| if ((more as any)[key] !== (less as any)[key] | |
| && !((more as any)[key] == null && (less as any)[key] == null) | |
| ) { | |
| return false; | |
| } | |
| } | |
| } | |
| return true; | |
| } | |
| function shadowClone<T extends object>(obj: T): T { | |
| const newObj = {} as T; | |
| for (const key in obj) { | |
| if (obj.hasOwnProperty(key)) { | |
| newObj[key] = obj[key]; | |
| } | |
| } | |
| return newObj; | |
| } | |
| it('all', function () { | |
| function testMerge( | |
| targetOption: BoxLayoutOptionMixin, | |
| newOption: BoxLayoutOptionMixin, | |
| result: BoxLayoutOptionMixin, | |
| resultIgnoreSize?: BoxLayoutOptionMixin | |
| ) { | |
| const t1 = shadowClone(targetOption); | |
| const t2 = shadowClone(targetOption); | |
| const n1 = shadowClone(newOption); | |
| const n2 = shadowClone(newOption); | |
| mergeLayoutParam(t1, n1); | |
| mergeLayoutParam(t2, n2, {ignoreSize: true}); | |
| expectPropsEqual(t1, result); | |
| expectPropsEqual(t2, resultIgnoreSize || result); | |
| } | |
| function singleValueAdd(val: number | string): void { | |
| testMerge({}, {width: val}, {width: val}); | |
| testMerge({}, {left: val}, {left: val}); | |
| testMerge({}, {right: val}, {right: val}); | |
| testMerge({}, {height: val}, {height: val}); | |
| testMerge({}, {top: val}, {top: val}); | |
| testMerge({}, {bottom: val}, {bottom: val}); | |
| } | |
| singleValueAdd(10); | |
| singleValueAdd('30%'); | |
| singleValueAdd('left'); | |
| singleValueAdd('right'); | |
| singleValueAdd('center'); | |
| function singleValueReplace(val: number | string): void { | |
| testMerge({width: -999}, {width: val}, {width: val}); | |
| testMerge({left: -999}, {left: val}, {left: val}); | |
| testMerge({right: -999}, {right: val}, {right: val}); | |
| testMerge({height: -999}, {height: val}, {height: val}); | |
| testMerge({top: -999}, {top: val}, {top: val}); | |
| testMerge({bottom: -999}, {bottom: val}, {bottom: val}); | |
| } | |
| singleValueReplace(10); | |
| singleValueReplace('30%'); | |
| singleValueReplace('left'); | |
| singleValueReplace('right'); | |
| singleValueReplace('center'); | |
| testMerge( | |
| {}, {width: 10, left: 20, right: 30}, | |
| {width: 10, left: 20, right: 30}, | |
| {width: 10, left: 20} | |
| ); | |
| testMerge( | |
| {}, {height: 10, top: 20, bottom: 30}, | |
| {height: 10, top: 20, bottom: 30}, | |
| {height: 10, top: 20} | |
| ); | |
| testMerge( | |
| {}, {width: 10, left: 20, right: 30, height: 10, top: 20, bottom: 30}, | |
| {width: 10, left: 20, right: 30, height: 10, top: 20, bottom: 30}, | |
| {width: 10, left: 20, height: 10, top: 20} | |
| ); | |
| testMerge( | |
| {width: 111, top: 555}, {width: 10, left: 20, right: 30}, | |
| {width: 10, left: 20, right: 30, top: 555}, | |
| {width: 10, left: 20, top: 555} | |
| ); | |
| testMerge( | |
| {width: 111, left: 222, top: 'bottom'}, {right: 30}, | |
| {width: 111, right: 30, top: 'bottom'} | |
| ); | |
| testMerge( | |
| {width: 111, right: 222, top: 'bottom'}, {left: 30}, | |
| {width: 111, left: 30, top: 'bottom'} | |
| ); | |
| testMerge( | |
| {height: 111, top: 222, left: 'right'}, {bottom: 30}, | |
| {height: 111, bottom: 30, left: 'right'} | |
| ); | |
| testMerge( | |
| {height: 111, bottom: 222, left: 'right'}, {top: 30}, | |
| {height: 111, top: 30, left: 'right'} | |
| ); | |
| testMerge( | |
| {left: 222, top: 'bottom'}, {width: '33%', right: 30}, | |
| {width: '33%', right: 30, top: 'bottom'} | |
| ); | |
| testMerge( | |
| {right: 222, top: 'bottom'}, {width: '33%', left: 30}, | |
| {width: '33%', left: 30, top: 'bottom'} | |
| ); | |
| testMerge( | |
| {top: 222, left: 'right'}, {height: '33%', bottom: 30}, | |
| {height: '33%', bottom: 30, left: 'right'} | |
| ); | |
| testMerge( | |
| {bottom: 222, left: 'right'}, {height: '33%', top: 30}, | |
| {height: '33%', top: 30, left: 'right'} | |
| ); | |
| testMerge( | |
| {left: 222, top: 'center'}, {width: '33%'}, | |
| {width: '33%', left: 222, top: 'center'} | |
| ); | |
| testMerge( | |
| {right: 222, top: 'center'}, {width: '33%'}, | |
| {width: '33%', right: 222, top: 'center'} | |
| ); | |
| testMerge( | |
| {top: 222, left: 'center'}, {height: '33%'}, | |
| {height: '33%', top: 222, left: 'center'} | |
| ); | |
| testMerge( | |
| {bottom: 222, left: 'center'}, {height: '33%'}, | |
| {height: '33%', bottom: 222, left: 'center'} | |
| ); | |
| testMerge( | |
| {width: 222, top: 'center'}, {left: '33%', right: 55, bottom: 3}, | |
| {left: '33%', right: 55, top: 'center', bottom: 3}, | |
| {width: 222, left: '33%', bottom: 3} | |
| ); | |
| testMerge( | |
| {height: 222, left: 'center'}, {top: '33%', bottom: 55, right: 3}, | |
| {top: '33%', bottom: 55, left: 'center', right: 3}, | |
| {height: 222, top: '33%', right: 3} | |
| ); | |
| testMerge( | |
| {left: 222, top: 999}, {right: '33%', bottom: 3}, | |
| {left: 222, top: 999, right: '33%', bottom: 3}, | |
| {right: '33%', bottom: 3} | |
| ); | |
| testMerge( | |
| {right: 222, bottom: 999}, {left: '33%', top: 3}, | |
| {right: 222, bottom: 999, left: '33%', top: 3}, | |
| {left: '33%', top: 3} | |
| ); | |
| }); | |
| }); | |
| }); |