// 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';

main() {
  group('lsp_packet_transformer', () {
    test('transforms data received as individual bytes', () async {
      final payload = '{ json payload }';
      final lspPacket = makeLspPacket(payload);
      final output = await new Stream.fromIterable([lspPacket])
          .transform(new 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 new Stream.fromIterable(dataPackets)
          .transform(new 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 new Stream.fromIterable([lspPacket])
          .transform(new 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 new Stream.fromIterable([lspPacket])
          .transform(new 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 new Stream.fromIterable([lspPacket])
          .transform(new 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 new Stream.fromIterable([lspPacket])
          .transform(new 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 = await new Stream.fromIterable([lspPacket])
          .transform(new LspPacketTransformer());

      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();
}
