| /** |
| * @license |
| * Copyright (C) 2026 The Android Open Source Project |
| * |
| * Licensed 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 './gr-opacity-diff-mode'; |
| import {OpacityDiffMode} from './gr-opacity-diff-mode'; |
| import {fixture, html, assert} from '@open-wc/testing'; |
| |
| function getComputedStyleValue(name: string, el: HTMLElement) { |
| let style; |
| if ((window as any).ShadyCSS) { |
| style = (window as any).ShadyCSS.getComputedStyleValue(el, name); |
| } else if ((el as any).getComputedStyleValue) { |
| style = ((el as any).getComputedStyleValue(name)); |
| } else { |
| style = getComputedStyle(el).getPropertyValue(name); |
| } |
| return style; |
| } |
| |
| suite('gr-opacity-diff-tool tests', () => { |
| let element: OpacityDiffMode; |
| |
| setup(async () => { |
| element = await fixture<OpacityDiffMode>( |
| html`<gr-opacity-diff-mode></gr-opacity-diff-mode>` |
| ); |
| }); |
| |
| test('slider changes opacity of image', async () => { |
| const arrayOfNumbers = [0.73, 0.5, 0.0]; |
| const opacitySlider = element.shadowRoot!.querySelector( |
| '#opacitySlider' |
| ) as HTMLInputElement; |
| const wrapper = element.shadowRoot!.querySelector('.wrapper') as HTMLElement; |
| for (const number of arrayOfNumbers) { |
| assert.notEqual(getComputedStyleValue('--my-opacity-value', wrapper), String(number)); |
| opacitySlider.value = String(number); |
| // Mock firing input event |
| opacitySlider.dispatchEvent(new Event('input')); |
| element.handleOpacityChange({target: opacitySlider} as any); |
| await element.updateComplete; |
| assert.equal(getComputedStyleValue('--my-opacity-value', wrapper).trim(), String(number)); |
| } |
| }); |
| |
| test('create the src string for images', () => { |
| element.revisionImage = { |
| type: 'IMG/src', |
| body: 'Zx3Cgffk=', |
| }; |
| const expectedOutcome = 'data:IMG/src;base64, Zx3Cgffk='; |
| assert.equal(element.computeSrcString(element.revisionImage), expectedOutcome); |
| }); |
| |
| test('size scaling', async () => { |
| (element as any).maxWidth = 200; |
| (element as any).maxHeight = 400; |
| await element.updateComplete; |
| |
| const wrapper = element.shadowRoot!.querySelector('.wrapper') as HTMLElement; |
| assert.equal(getComputedStyleValue('--img-width', wrapper).trim(), ''); |
| assert.equal(getComputedStyleValue('--img-height', wrapper).trim(), ''); |
| const scaleSizesToggle = element.shadowRoot!.querySelector( |
| '#scaleSizesToggle' |
| ) as HTMLInputElement; |
| |
| scaleSizesToggle.checked = true; |
| scaleSizesToggle.dispatchEvent(new Event('click')); |
| element.handleScaleSizesToggle({target: scaleSizesToggle} as any); |
| await element.updateComplete; |
| |
| assert.equal(getComputedStyleValue('--img-width', wrapper).trim(), '200px'); |
| assert.equal(getComputedStyleValue('--img-height', wrapper).trim(), '400px'); |
| }); |
| |
| test('resize the div container for base & revision image comparison', async () => { |
| const wrapper = element.shadowRoot!.querySelector('.wrapper') as HTMLElement; |
| assert.equal(getComputedStyleValue('--div-height', wrapper).trim(), ''); |
| (element as any).maxHeight = 500; |
| (element as any).maxWidth = 300; |
| await element.updateComplete; |
| |
| assert.equal(getComputedStyleValue('--div-height', wrapper).trim(), '500px'); |
| }); |
| }); |