/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * 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 AbilityDelegatorRegistry from '@ohos.app.ability.abilityDelegatorRegistry';
import { describe, it, expect } from '@ohos/hypium';
import { Driver, MatchPattern, ON, MouseButton } from '@ohos.UiTest';

const TAG = '[Sample_Native_XComponent]';

export default function abilityTest() {

  describe('ActsAbilityTest', () => {
    /**
     * 打开应用
     */
    it('StartAbility_001', 0, async (done: Function) => {
      console.info(TAG, 'StartAbility_001 begin');
      let driver = Driver.create();
      let abilityDelegator = AbilityDelegatorRegistry.getAbilityDelegator();
      try {
        await abilityDelegator.startAbility({
          bundleName: 'com.example.nativexcomponent',
          abilityName: 'EntryAbility'
        });
      } catch (exception) {
        console.info(TAG, `StartAbility_001 exception = ${JSON.stringify(exception)}`);
        expect().assertFail();
      }
      await driver.delayMs(1000);
      // 判断XComponent onLoad回调执行成功
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard=',MatchPattern.STARTS_WITH));
      done();
      console.info(TAG, 'StartAbility_001 end');
    })

    /**
     * 点击按钮,按钮
     */
    it('DrawShape_001', 2, async (done: Function) => {
      console.info(TAG, 'CreateFiles_001 begin');
      let driver = Driver.create();
      // 判断XComponent onLoad回调执行成功
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH));
      // 判断是否有按键
      await driver.assertComponentExist(ON.text('创建/销毁'));
      let drawStarBtn = await driver.findComponent(ON.text('创建/销毁'));
      // 点击'创建/销毁'按钮
      await drawStarBtn.click();
      await driver.delayMs(1000);

      // 判断xcomponent组件已经消失
      let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH));
      expect(xcomponent === null).assertTrue();

      await drawStarBtn.click();
      await driver.delayMs(1000);
      // 判断xcomponent组件复现
      let xcomponent2 = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH));
      expect(xcomponent2 === null).assertFalse();
      done();
      console.info(TAG, 'DrawShape_001 end');
    })

    it('DrawShape_002', 2, async (done: Function) => {
      console.info(TAG, 'DrawShape_002 begin');
      let driver = Driver.create();
      // 判断XComponent onLoad回调执行成功
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH));
      // 判断是否有按键
      await driver.assertComponentExist(ON.text('创建/销毁'));

      // 点击XComponent组件
      let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH));
      expect(xcomponent === null).assertFalse();
      await xcomponent.click();
      await driver.delayMs(1000);
      // 判断touch回调已执行
      await driver.assertComponentExist(ON.id('xcp',MatchPattern.STARTS_WITH));
      done();
      console.info(TAG, 'DrawShape_002 end');
    })

    it('SetExpectedFrameRate_001 ', 2, async (done: Function) => {
      console.info(TAG, 'SetExpectedFrameRate_001 start');
      let driver = await Driver.create();
      await driver.delayMs(1000);
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));

      let minBtn = await driver.findComponent(ON.text('min', MatchPattern.STARTS_WITH));
      expect(minBtn === null).assertFalse();

      let minSlider = await driver.findComponent(ON.id('minSlider'));
      expect(minSlider === null).assertFalse();
      let point = await minSlider.getBoundsCenter();
      await driver.mouseClick(point, MouseButton.MOUSE_BUTTON_LEFT);
      await driver.delayMs(1000);

      let text = await minBtn.getText();
      expect(text.toString() == 'min: 120').assertTrue();

      done();
      console.info(TAG, 'SetExpectedFrameRate_001 end');
    })

    it('SetExpectedFrameRate_002 ', 2, async (done: Function) => {
      console.info(TAG, 'SetExpectedFrameRate_002 start');
      let driver = await Driver.create();
      await driver.delayMs(1000);
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));

      let maxBtn = await driver.findComponent(ON.text('max', MatchPattern.STARTS_WITH));
      expect(maxBtn === null).assertFalse();

      let maxSlider = await driver.findComponent(ON.id('maxSlider'));
      expect(maxSlider === null).assertFalse();
      let rect = await maxSlider.getBounds();
      await driver.mouseClick({x:rect.right, y:(rect.top+rect.bottom)/2}, MouseButton.MOUSE_BUTTON_LEFT);
      await driver.delayMs(1000);

      let text = await maxBtn.getText();
      expect(text.toString() == 'max: 240').assertTrue();

      done();
      console.info(TAG, 'SetExpectedFrameRate_002 end');
    })

    it('SetExpectedFrameRate_003 ', 2, async (done: Function) => {
      console.info(TAG, 'SetExpectedFrameRate_003 start');
      let driver = await Driver.create();
      await driver.delayMs(1000);
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));

      let expectedBtn = await driver.findComponent(ON.text('expected', MatchPattern.STARTS_WITH));
      expect(expectedBtn === null).assertFalse();

      let expectedSlider = await driver.findComponent(ON.id('expectedSlider'));
      expect(expectedSlider === null).assertFalse();
      let point = await expectedSlider.getBoundsCenter();
      await driver.mouseClick(point, MouseButton.MOUSE_BUTTON_LEFT);
      await driver.delayMs(1000);

      let text = await expectedBtn.getText();
      expect(text.toString() == 'expected: 120').assertTrue();

      done();
      console.info(TAG, 'SetExpectedFrameRate_003 end');
    })

    it('SetSoftKeyboard_001', 2, async (done: Function) => {
      console.info(TAG, 'SetSoftKeyboard_001 start');
      let driver = Driver.create();
      await driver.delayMs(1000);
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));

      let text = await driver.findComponent(ON.id('textInput'));
      expect(text === null).assertFalse();
      await text.click();
      await driver.delayMs(1000);
      expect(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH) == null).assertFalse();

      // 点击XComponent组件
      let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH));
      expect(xcomponent === null).assertFalse();
      await xcomponent.click();
      await driver.delayMs(1000);

      done();
      console.info(TAG, 'SetSoftKeyboard_001 end');
    })

    it('SetSoftKeyboard_002', 2, async (done: Function) => {
      console.info(TAG, 'SetSoftKeyboard_002 start');
      let driver = Driver.create();
      await driver.delayMs(1000);
      await driver.assertComponentExist(ON.text('期望帧率设置:'));
      await driver.assertComponentExist(ON.text('单指点击XComponent软键盘消失'));
      await driver.assertComponentExist(ON.text('创建/销毁'));
      await driver.assertComponentExist(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));

      let button_softKeyboard = await driver.findComponent(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH));
      expect(button_softKeyboard === null).assertFalse();
      await button_softKeyboard.click();
      let text = await driver.findComponent(ON.id('textInput'));
      expect(text === null).assertFalse();
      await text.click();
      await driver.delayMs(1000);
      expect(ON.text('needSoftKeyboard', MatchPattern.STARTS_WITH) == null).assertFalse();

      // 点击XComponent组件
      let xcomponent = await driver.findComponent(ON.id('xcp', MatchPattern.STARTS_WITH));
      expect(xcomponent === null).assertFalse();
      await xcomponent.click();
      await driver.delayMs(1000);

      done();
      console.info(TAG, 'SetSoftKeyboard_002 end');
    })
  })
}