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