/*
 * Copyright (C) 2022 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 {
  NativeHookStatistics,
  NativeHookMalloc,
  NativeEventHeap,
  NativeHookProcess,
  NativeHookStatisticsTableData,
  NativeMemory,
  NativeHookSamplerInfo,
  NativeHookSampleQueryInfo,
  NativeHookCallInfo,
  NativeEvent,
} from '../../../src/trace/bean/NativeHook';
jest.mock('../../../src/trace/component/trace/base/TraceRow', () => {
  return {};
});

describe('NativeHook Test', () => {
  it('NativeHookStatisticsTest01', function () {
    let nativeHookStatistics = new NativeHookStatistics();
    nativeHookStatistics = {
      eventId: 0,
      eventType: 'eventType',
      subType: 'subType',
      heapSize: 0,
      addr: 'addr',
      startTs: 0,
      endTs: 0,
      sumHeapSize: 0,
      max: 0,
      count: 0,
      tid: 0,
      isSelected: false,
    };
    expect(nativeHookStatistics).not.toBeUndefined();
    expect(nativeHookStatistics).toMatchInlineSnapshot(
{
  eventId: expect.any(Number),
  eventType: expect.any(String),
  subType: expect.any(String),
  heapSize: expect.any(Number),
  addr: expect.any(String),
  startTs: expect.any(Number),
  endTs: expect.any(Number),
  sumHeapSize: expect.any(Number),
  max: expect.any(Number),
  count: expect.any(Number),
  tid: expect.any(Number),
  isSelected: expect.any(Boolean) }, `
{
  "addr": Any<String>,
  "count": Any<Number>,
  "endTs": Any<Number>,
  "eventId": Any<Number>,
  "eventType": Any<String>,
  "heapSize": Any<Number>,
  "isSelected": Any<Boolean>,
  "max": Any<Number>,
  "startTs": Any<Number>,
  "subType": Any<String>,
  "sumHeapSize": Any<Number>,
  "tid": Any<Number>,
}
`);
  });

  it('NativeEventHeapTest02', function () {
    let nativeHookMalloc = new NativeHookMalloc();
    nativeHookMalloc = {
      eventType: 'eventType',
      subType: 'subType',
      heapSize: 0,
      allocByte: 0,
      allocCount: 0,
      freeByte: 0,
      freeCount: 0,
    };
    expect(nativeHookMalloc).not.toBeUndefined();
    expect(nativeHookMalloc).toMatchInlineSnapshot(
{
  eventType: expect.any(String),
  subType: expect.any(String),
  heapSize: expect.any(Number),
  allocByte: expect.any(Number),
  allocCount: expect.any(Number),
  freeByte: expect.any(Number),
  freeCount: expect.any(Number) }, `
{
  "allocByte": Any<Number>,
  "allocCount": Any<Number>,
  "eventType": Any<String>,
  "freeByte": Any<Number>,
  "freeCount": Any<Number>,
  "heapSize": Any<Number>,
  "subType": Any<String>,
}
`);
  });

  it('NativeEventHeapTest03', function () {
    let nativeEventHeap = new NativeEventHeap();
    nativeEventHeap = {
      eventType: 'eventType',
      sumHeapSize: 0,
    };
    expect(nativeEventHeap).not.toBeUndefined();
    expect(nativeEventHeap).toMatchInlineSnapshot(
{
  eventType: expect.any(String),
  sumHeapSize: expect.any(Number) }, `
{
  "eventType": Any<String>,
  "sumHeapSize": Any<Number>,
}
`);
  });

  it('NativeHookProcessTest04', function () {
    let nativeHookProcess = new NativeHookProcess();
    nativeHookProcess = {
      ipid: 0,
      pid: 0,
      name: 'name',
    };
    expect(nativeHookProcess).not.toBeUndefined();
    expect(nativeHookProcess).toMatchInlineSnapshot(
{
  ipid: expect.any(Number),
  pid: expect.any(Number),
  name: expect.any(String) }, `
{
  "ipid": Any<Number>,
  "name": Any<String>,
  "pid": Any<Number>,
}
`);
  });

  it('NativeHookStatisticsTableDataTest05', function () {
    let nativeHookStatisticsTableData = new NativeHookStatisticsTableData();
    nativeHookStatisticsTableData = {
      memoryTap: '',
      existing: 0,
      existingString: '',
      allocCount: 0,
      freeCount: 0,
      totalBytes: 0,
      totalBytesString: '',
      maxStr: '',
      max: 0,
      totalCount: 0,
    };
    expect(nativeHookStatisticsTableData).not.toBeUndefined();
    expect(nativeHookStatisticsTableData).toMatchInlineSnapshot(
{
  memoryTap: expect.any(String),
  existing: expect.any(Number),
  existingString: expect.any(String),
  allocCount: expect.any(Number),
  freeCount: expect.any(Number),
  totalBytes: expect.any(Number),
  totalBytesString: expect.any(String),
  maxStr: expect.any(String),
  max: expect.any(Number),
  totalCount: expect.any(Number) }, `
{
  "allocCount": Any<Number>,
  "existing": Any<Number>,
  "existingString": Any<String>,
  "freeCount": Any<Number>,
  "max": Any<Number>,
  "maxStr": Any<String>,
  "memoryTap": Any<String>,
  "totalBytes": Any<Number>,
  "totalBytesString": Any<String>,
  "totalCount": Any<Number>,
}
`);
  });

  it('NativeMemoryTest06', function () {
    let nativeMemory = new NativeMemory();
    nativeMemory = {
      index: 0,
      eventId: 0,
      eventType: 'eventType',
      subType: 'subType',
      addr: 'addr',
      startTs: 0,
      timestamp: 'timestamp',
      heapSize: 0,
      heapSizeUnit: 'heapSizeUnit',
      symbol: 'symbol',
      library: 'library',
      isSelected: false,
    };
    expect(nativeMemory).not.toBeUndefined();
    expect(nativeMemory).toMatchInlineSnapshot(
{
  index: expect.any(Number),
  eventId: expect.any(Number),
  eventType: expect.any(String),
  subType: expect.any(String),
  addr: expect.any(String),
  startTs: expect.any(Number),
  timestamp: expect.any(String),
  heapSize: expect.any(Number),
  heapSizeUnit: expect.any(String),
  symbol: expect.any(String),
  library: expect.any(String),
  isSelected: expect.any(Boolean) }, `
{
  "addr": Any<String>,
  "eventId": Any<Number>,
  "eventType": Any<String>,
  "heapSize": Any<Number>,
  "heapSizeUnit": Any<String>,
  "index": Any<Number>,
  "isSelected": Any<Boolean>,
  "library": Any<String>,
  "startTs": Any<Number>,
  "subType": Any<String>,
  "symbol": Any<String>,
  "timestamp": Any<String>,
}
`);
  });

  it('NativeHookCallInfoTest07', function () {
    let nativeHookSamplerInfo = new NativeHookSamplerInfo();
    nativeHookSamplerInfo = {
      current: 'current',
      currentSize: 0,
      startTs: 0,
      heapSize: 0,
      snapshot: 'snapshot',
      growth: 'growth',
      total: 0,
      totalGrowth: 'totalGrowth',
      existing: 0,
      timestamp: 'timestamp',
      eventId: -1,
    };
    expect(nativeHookSamplerInfo).not.toBeUndefined();
    expect(nativeHookSamplerInfo).toMatchInlineSnapshot(
{
  current: expect.any(String),
  currentSize: expect.any(Number),
  startTs: expect.any(Number),
  heapSize: expect.any(Number),
  snapshot: expect.any(String),
  growth: expect.any(String),
  total: expect.any(Number),
  totalGrowth: expect.any(String),
  existing: expect.any(Number),
  timestamp: expect.any(String),
  eventId: expect.any(Number) }, `
{
  "current": Any<String>,
  "currentSize": Any<Number>,
  "eventId": Any<Number>,
  "existing": Any<Number>,
  "growth": Any<String>,
  "heapSize": Any<Number>,
  "snapshot": Any<String>,
  "startTs": Any<Number>,
  "timestamp": Any<String>,
  "total": Any<Number>,
  "totalGrowth": Any<String>,
}
`);
  });

  it('NativeHookCallInfoTest08', function () {
    let nativeHookSampleQueryInfo = new NativeHookSampleQueryInfo();
    nativeHookSampleQueryInfo = {
      eventId: -1,
      current: 0,
      eventType: 'eventType',
      subType: 'subType',
      growth: 0,
      existing: 0,
      addr: 'addr',
      startTs: 0,
      endTs: 0,
      total: 0,
    };

    expect(nativeHookSampleQueryInfo).not.toBeUndefined();
    expect(nativeHookSampleQueryInfo).toMatchInlineSnapshot(
{
  eventId: expect.any(Number),
  current: expect.any(Number),
  eventType: expect.any(String),
  subType: expect.any(String),
  growth: expect.any(Number),
  existing: expect.any(Number),
  addr: expect.any(String),
  startTs: expect.any(Number),
  endTs: expect.any(Number),
  total: expect.any(Number) }, `
{
  "addr": Any<String>,
  "current": Any<Number>,
  "endTs": Any<Number>,
  "eventId": Any<Number>,
  "eventType": Any<String>,
  "existing": Any<Number>,
  "growth": Any<Number>,
  "startTs": Any<Number>,
  "subType": Any<String>,
  "total": Any<Number>,
}
`);
  });

  it('NativeHookCallInfoTest09', function () {
    let nativeHookCallInfo = new NativeHookCallInfo();
    nativeHookCallInfo = {
      id: 'id',
      pid: 'pid',
      library: 'library',
      title: 'title',
      count: 0,
      type: 0,
      heapSize: 0,
      heapSizeStr: 'heapSizeStr',
      eventId: 0,
      threadId: 0,
      isSelected: false,
    };
    expect(nativeHookCallInfo).not.toBeUndefined();
    expect(nativeHookCallInfo).toMatchInlineSnapshot(
{
  id: expect.any(String),
  pid: expect.any(String),
  library: expect.any(String),
  title: expect.any(String),
  count: expect.any(Number),
  type: expect.any(Number),
  heapSize: expect.any(Number),
  heapSizeStr: expect.any(String),
  eventId: expect.any(Number),
  threadId: expect.any(Number),
  isSelected: expect.any(Boolean) }, `
{
  "count": Any<Number>,
  "eventId": Any<Number>,
  "heapSize": Any<Number>,
  "heapSizeStr": Any<String>,
  "id": Any<String>,
  "isSelected": Any<Boolean>,
  "library": Any<String>,
  "pid": Any<String>,
  "threadId": Any<Number>,
  "title": Any<String>,
  "type": Any<Number>,
}
`);
  });

  it('NativeHookCallInfoTest10', function () {
    let nativeHookSamplerInfo = new NativeHookSamplerInfo();
    expect(nativeHookSamplerInfo.merageObj(NativeHookSamplerInfo)).toBeUndefined();
  });

  it('NativeEventHeapTest11', function () {
    let nativeEvent = new NativeEvent();
    nativeEvent = {
      startTime: 0,
      heapSize: 0,
      eventType: '',
    };
    expect(nativeEvent).not.toBeUndefined();
    expect(nativeEvent).toMatchInlineSnapshot(
{
  startTime: expect.any(Number),
  heapSize: expect.any(Number),
  eventType: expect.any(String) }, `
{
  "eventType": Any<String>,
  "heapSize": Any<Number>,
  "startTime": Any<Number>,
}
`);
  });
});