// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'dart:convert';

import 'package:analysis_server/src/lsp/lsp_packet_transformer.dart';
import 'package:test/test.dart';

void main() {
  group('lsp_packet_transformer', () {
    test('transforms data received as individual bytes', () async {
      final payload = '{ json payload }';
      final lspPacket = makeLspPacket(payload);
      final output = await Stream.fromIterable([lspPacket])
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('transforms data received in chunks', () async {
      final payload = '{ json\n payload\n  }';
      final lspPacket = makeLspPacket(payload);
      // Separate each byte into it's own "packet" to simulate chunked data
      // where all the bytes for a single LSP packet don't arrive in one
      // item to the stream.
      final dataPackets = lspPacket.map((b) => [b]);
      final output = await Stream.fromIterable(dataPackets)
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('handles unicode characters', () async {
      // This file is saved as UTF8.
      final payload = '{ json payload 🎉 }';
      final lspPacket = makeLspPacket(payload);
      final output = await Stream.fromIterable([lspPacket])
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('accepts "utf-8" as an encoding', () async {
      final payload = '{ json payload 🎉 }';
      final lspPacket =
          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf-8');
      final output = await Stream.fromIterable([lspPacket])
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('accepts "utf8" as an encoding', () async {
      final payload = '{ json payload 🎉 }';
      final lspPacket =
          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=utf8');
      final output = await Stream.fromIterable([lspPacket])
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('accepts no encoding', () async {
      final payload = '{ json payload 🎉 }';
      final lspPacket = makeLspPacket(payload, 'application/vscode-jsonrpc;');
      final output = await Stream.fromIterable([lspPacket])
          .transform(LspPacketTransformer())
          .toList();
      expect(output, equals([payload]));
    });

    test('rejects invalid encoding', () async {
      final payload = '{ json payload }';
      final lspPacket =
          makeLspPacket(payload, 'application/vscode-jsonrpc; charset=ascii');
      final outputStream =
          Stream.fromIterable([lspPacket]).transform(LspPacketTransformer());

      await expectLater(outputStream.toList(),
          throwsA(const TypeMatcher<InvalidEncodingError>()));
    });
  });
}

List<int> makeLspPacket(String json, [String? contentType]) {
  final utf8EncodedBody = utf8.encode(json);
  final header = 'Content-Length: ${utf8EncodedBody.length}' +
      (contentType != null ? '\r\nContent-Type: $contentType' : '') +
      '\r\n\r\n';
  final asciiEncodedHeader = ascii.encode(header);

  return asciiEncodedHeader.followedBy(utf8EncodedBody).toList();
}
