/* * 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(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} ); }); }); });