// Copyright 2021 The Pigweed Authors
//
// 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
//
//     https://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.

/* eslint-env browser, jasmine */
import 'jasmine';

import {Buffer} from 'buffer';

import {Encoder} from './encoder';
import * as protocol from './protocol';
import * as util from './util';

const FLAG = Uint8Array.from([protocol.FLAG]);

function withFCS(data: Uint8Array): Uint8Array {
  return util.concatenate(data, protocol.frameCheckSequence(data));
}

function withFlags(data: Uint8Array): Uint8Array {
  return util.concatenate(FLAG, data, FLAG);
}

describe('Encoder', () => {
  let encoder: Encoder;
  let textEncoder: TextEncoder;

  beforeEach(() => {
    encoder = new Encoder();
    textEncoder = new TextEncoder();
  });

  it('creates frame for empty data', () => {
    const data = textEncoder.encode('');
    expect(encoder.uiFrame(0, data))
        .toEqual(withFlags(withFCS(new Uint8Array([0x01, 0x03]))));
    expect(encoder.uiFrame(0x1a, data))
        .toEqual(withFlags(withFCS(new Uint8Array([0x35, 0x03]))));
    expect(encoder.uiFrame(0x1a, data))
        .toEqual(withFlags(withFCS(textEncoder.encode('\x35\x03'))));
  });

  it('creates frame for one byte', () => {
    const data = textEncoder.encode('A');
    expect(encoder.uiFrame(0, data))
        .toEqual(withFlags(withFCS(textEncoder.encode('\x01\x03A'))));
  });

  it('creates frame for multibyte data', () => {
    const data = textEncoder.encode('123456789');
    expect(encoder.uiFrame(0, data))
        .toEqual(withFlags(withFCS(textEncoder.encode('\x01\x03123456789'))));
  });

  it('creates frame for multibyte data with address', () => {
    const data = textEncoder.encode('123456789');
    expect(encoder.uiFrame(128, data))
        .toEqual(
            withFlags(withFCS(textEncoder.encode('\x00\x03\x03123456789'))));
  });

  it('creates frame for data with escape sequence', () => {
    const data = textEncoder.encode('\x7d');
    const expectedContent = util.concatenate(
        textEncoder.encode('\x7d\x5d\x03\x7d\x5d'),
        protocol.frameCheckSequence(textEncoder.encode('\x7d\x03\x7d')));
    expect(encoder.uiFrame(0x3e, data)).toEqual(withFlags(expectedContent));

    const data2 = textEncoder.encode('A\x7e\x7dBC');
    const expectedContent2 = util.concatenate(
        textEncoder.encode('\x7d\x5d\x03A\x7d\x5e\x7d\x5dBC'),
        protocol.frameCheckSequence(textEncoder.encode('\x7d\x03A\x7e\x7dBC')));
    expect(encoder.uiFrame(0x3e, data2)).toEqual(withFlags(expectedContent2));
  });
});
