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