// Copyright (c) 2014, 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.

library test.protocol;

import 'dart:convert';

import 'package:analysis_server/src/protocol.dart';
import 'package:unittest/unittest.dart';

import 'reflective_tests.dart';


Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());


main() {
  groupSep = ' | ';
  group('Notification', () {
    runReflectiveTests(NotificationTest);
  });
  group('Request', () {
    runReflectiveTests(RequestTest);
  });
  group('RequestError', () {
    runReflectiveTests(RequestErrorTest);
  });
  group('RequestDatum', () {
    runReflectiveTests(RequestDatumTest);
  });
  group('Response', () {
    runReflectiveTests(ResponseTest);
  });
}


@ReflectiveTestCase()
class InvalidParameterResponseMatcher extends Matcher {
  static const int ERROR_CODE = -2;

  @override
  Description describe(Description description) => description.add(
      "an 'invalid parameter' response (code $ERROR_CODE)");

  @override
  bool matches(item, Map matchState) {
    if (item is! RequestFailure) {
      return false;
    }
    var response = item.response;
    if (response is! Response) {
      return false;
    }
    if (response.error is! RequestError) {
      return false;
    }
    RequestError requestError = response.error;
    if (requestError.code != ERROR_CODE) {
      return false;
    }
    return true;
  }
}


@ReflectiveTestCase()
class NotificationTest {
  void test_fromJson() {
    Notification original = new Notification('foo');
    Notification notification = new Notification.fromJson(original.toJson());
    expect(notification.event, equals('foo'));
    expect(notification.params.length, equals(0));
    expect(notification.getParameter('x'), isNull);
  }

  void test_fromJson_withParams() {
    Notification original = new Notification('foo');
    original.setParameter('x', 'y');
    Notification notification = new Notification.fromJson(original.toJson());
    expect(notification.event, equals('foo'));
    expect(notification.params.length, equals(1));
    expect(notification.getParameter('x'), equals('y'));
  }

  void test_getParameter_defined() {
    Notification notification = new Notification('foo');
    notification.setParameter('x', 'y');
    expect(notification.event, equals('foo'));
    expect(notification.params.length, equals(1));
    expect(notification.getParameter('x'), equals('y'));
    expect(notification.toJson(), equals({
      'event': 'foo',
      'params': {
        'x': 'y'
      }
    }));
  }

  void test_getParameter_undefined() {
    Notification notification = new Notification('foo');
    expect(notification.event, equals('foo'));
    expect(notification.params.length, equals(0));
    expect(notification.getParameter('x'), isNull);
    expect(notification.toJson(), equals({
      'event': 'foo'
    }));
  }
}


@ReflectiveTestCase()
class RequestDatumTest {
  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>(
      "RequestDatum");

  static Request request;
  static Matcher _throwsInvalidParameter = throwsA(
      new InvalidParameterResponseMatcher());

  void setUp() {
    request = new Request('myId', 'myMethod');
  }

  void test_asBool() {
    expect(makeDatum(true).asBool(), isTrue);
    expect(makeDatum(false).asBool(), isFalse);
    expect(makeDatum('true').asBool(), isTrue);
    expect(makeDatum('false').asBool(), isFalse);
    expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
  }

  void test_asInt() {
    expect(makeDatum(1).asInt(), equals(1));
    expect(makeDatum('2').asInt(), equals(2));
    expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
    expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
  }

  void test_asList_emptyList() {
    expect(makeDatum([]).asList((datum) => datum.asString()), equals([]));
  }

  void test_asList_nonEmptyList() {
    expect(makeDatum(['foo', 'bar']).asList((datum) => datum.asString()),
        equals(['foo', 'bar']));
  }

  void test_isList() {
    expect(makeDatum(3).isList, isFalse);
    expect(makeDatum(null).isList, isTrue);
    expect(makeDatum([]).isList, isTrue);
    expect(makeDatum(['foo', 'bar']).isList, isTrue);
  }

  void test_asList_nonList() {
    expect(() => makeDatum(3).asList((datum) => null), _throwsInvalidParameter);
  }

  void test_asList_null() {
    expect(makeDatum(null).asList((datum) => datum.asString()), equals([]));
  }

  void test_asString() {
    expect(makeDatum('foo').asString(), equals('foo'));
    expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
  }

  void test_isStringList() {
    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
    expect(makeDatum([]).isStringList, isTrue);
    expect(makeDatum(null).isStringList, isTrue);
    expect(makeDatum(['foo', 1]).isStringList, isFalse);
    expect(makeDatum({}).isStringList, isFalse);
  }

  void test_asStringList() {
    expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
    expect(makeDatum([]).asStringList(), equals([]));
    expect(makeDatum(null).asStringList(), equals([]));
    expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
    expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
  }

  void test_isStringListMap() {
    expect(makeDatum({
      'key1': ['value11', 'value12'],
      'key2': ['value21', 'value22']
    }).isStringListMap, isTrue);
    expect(makeDatum({
      'key1': 10,
      'key2': 20
    }).isStringListMap, isFalse);
    expect(makeDatum({
      'key1': [11, 12],
      'key2': [21, 22]
    }).isStringListMap, isFalse);
    expect(makeDatum({}).isStringListMap, isTrue);
    expect(makeDatum(null).isStringListMap, isTrue);
    expect(makeDatum(3).isStringListMap, isFalse);
  }

  void test_asStringListMap() {
    {
      var map = {
        'key1': ['value11', 'value12'],
        'key2': ['value21', 'value22']
      };
      expect(makeDatum(map).asStringListMap(), map);
    }
    {
      var map = {
        'key1': 10,
        'key2': 20
      };
      expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
    }
    {
      var map = {
        'key1': [11, 12],
        'key2': [21, 22]
      };
      expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
    }
  }

  void test_isMap() {
    expect(makeDatum({
      'key1': 'value1',
      'key2': 'value2'
    }).isMap, isTrue);
    expect(makeDatum({}).isMap, isTrue);
    expect(makeDatum(null).isMap, isTrue);
    expect(makeDatum({
      'key1': 'value1',
      'key2': 2
    }).isMap, isTrue);
    expect(makeDatum({
      'key1': 1,
      'key2': 2
    }).isMap, isTrue);
    expect(makeDatum([]).isMap, isFalse);
  }

  void test_isStringMap() {
    expect(makeDatum({
      'key1': 'value1',
      'key2': 'value2'
    }).isStringMap, isTrue);
    expect(makeDatum({}).isStringMap, isTrue);
    expect(makeDatum(null).isStringMap, isTrue);
    expect(makeDatum({
      'key1': 'value1',
      'key2': 2
    }).isStringMap, isFalse);
    expect(makeDatum({
      'key1': 1,
      'key2': 2
    }).isStringMap, isFalse);
    expect(makeDatum([]).isMap, isFalse);
  }

  void test_asStringMap() {
    expect(makeDatum({
      'key1': 'value1',
      'key2': 'value2'
    }).asStringMap(), equals({
      'key1': 'value1',
      'key2': 'value2'
    }));
    expect(makeDatum({}).asStringMap(), equals({}));
    expect(() => makeDatum({
      'key1': 'value1',
      'key2': 2
    }).asStringMap(), _throwsInvalidParameter);
    expect(() => makeDatum({
      'key1': 1,
      'key2': 2
    }).asStringMap(), _throwsInvalidParameter);
    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
  }

  void test_forEachMap_emptyMap() {
    makeDatum({}).forEachMap((key, value) {
      fail('Empty map should not be iterated');
    });
  }

  void test_forEachMap_nonMap() {
    expect(() => makeDatum(1).forEachMap((key, value) {
      fail('Non-map should not be iterated');
    }), _throwsInvalidParameter);
  }

   void test_forEachMap_null() {
    makeDatum(null).forEachMap((key, value) {
      fail('Empty map should not be iterated');
    });
  }

  void test_forEachMap_oneElementMap() {
    int callCount = 0;
    makeDatum({
      'key': 'value'
    }).forEachMap((key, value) {
      callCount++;
      expect(key, equals('key'));
      expect(value, isRequestDatum);
      expect(value.datum, equals('value'));
    });
    expect(callCount, equals(1));
  }

  void test_forEachMap_twoElementMap() {
    int callCount = 0;
    Map<String, String> map = {
      'key1': 'value1',
      'key2': 'value2'
    };
    Map iterationResult = {};
    makeDatum(map).forEachMap((key, value) {
      callCount++;
      expect(value, isRequestDatum);
      iterationResult[key] = value.datum;
    });
    expect(callCount, equals(2));
    expect(iterationResult, equals(map));
  }

  void test_hasKey() {
    var datum = makeDatum({
      'foo': 'bar'
    });
    expect(datum.hasKey('foo'), isTrue);
    expect(datum.hasKey('bar'), isFalse);
    expect(datum.hasKey('baz'), isFalse);
  }

  void test_hasKey_null() {
    expect(makeDatum(null).hasKey('foo'), isFalse);
  }

  void test_indexOperator_hasKey() {
    var indexResult = makeDatum({
      'foo': 'bar'
    })['foo'];
    expect(indexResult, isRequestDatum);
    expect(indexResult.datum, equals('bar'));
    expect(indexResult.path, equals('myPath.foo'));
  }

  void test_indexOperator_null() {
    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
  }

  void test_indexOperator_missingKey() {
    expect(() => makeDatum({
      'foo': 'bar'
    })['baz'], _throwsInvalidParameter);
  }

  void test_indexOperator_nonMap() {
    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
  }

  static RequestDatum makeDatum(dynamic datum) {
    return new RequestDatum(request, 'myPath', datum);
  }
}


@ReflectiveTestCase()
class RequestErrorTest {
  void test_create() {
    RequestError error = new RequestError(42, 'msg');
    expect(error.code, 42);
    expect(error.message, "msg");
    expect(error.toJson(), equals({
      RequestError.CODE: 42,
      RequestError.MESSAGE: "msg"
    }));
  }

  void test_create_internalError() {
    RequestError error = new RequestError.internalError();
    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
    expect(error.message, "Internal error");
  }

  void test_create_invalidParameters() {
    RequestError error = new RequestError.invalidParameters();
    expect(error.code, RequestError.CODE_INVALID_PARAMS);
    expect(error.message, "Invalid parameters");
  }

  void test_create_invalidRequest() {
    RequestError error = new RequestError.invalidRequest();
    expect(error.code, RequestError.CODE_INVALID_REQUEST);
    expect(error.message, "Invalid request");
  }

  void test_create_methodNotFound() {
    RequestError error = new RequestError.methodNotFound();
    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
    expect(error.message, "Method not found");
  }

  void test_create_parseError() {
    RequestError error = new RequestError.parseError();
    expect(error.code, RequestError.CODE_PARSE_ERROR);
    expect(error.message, "Parse error");
  }

  void test_create_serverAlreadyStarted() {
    RequestError error = new RequestError.serverAlreadyStarted();
    expect(error.code, RequestError.CODE_SERVER_ALREADY_STARTED);
    expect(error.message, "Server already started");
  }

  void test_fromJson() {
    var json = {
      RequestError.CODE: RequestError.CODE_PARSE_ERROR,
      RequestError.MESSAGE: 'foo',
      RequestError.DATA: {
        'ints': [1, 2, 3]
      }
    };
    RequestError error = new RequestError.fromJson(json);
    expect(error.code, RequestError.CODE_PARSE_ERROR);
    expect(error.message, "foo");
    expect(error.data['ints'], [1, 2, 3]);
    expect(error.getData('ints'), [1, 2, 3]);
  }

  void test_toJson() {
    RequestError error = new RequestError(0, 'msg');
    error.setData('answer', 42);
    error.setData('question', 'unknown');
    expect(error.toJson(), {
      RequestError.CODE: 0,
      RequestError.MESSAGE: 'msg',
      RequestError.DATA: {
        'answer': 42,
        'question': 'unknown'
      }
    });
  }
}


@ReflectiveTestCase()
class RequestTest {
  void test_fromJson() {
    Request original = new Request('one', 'aMethod');
    String json = JSON.encode(original.toJson());
    Request request = new Request.fromString(json);
    expect(request.id, equals('one'));
    expect(request.method, equals('aMethod'));
  }

  void test_fromJson_invalidId() {
    String json =
        '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
    Request request = new Request.fromString(json);
    expect(request, isNull);
  }

  void test_fromJson_invalidMethod() {
    String json =
        '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
    Request request = new Request.fromString(json);
    expect(request, isNull);
  }

  void test_fromJson_invalidParams() {
    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
    Request request = new Request.fromString(json);
    expect(request, isNull);
  }

  void test_fromJson_withParams() {
    Request original = new Request('one', 'aMethod');
    original.setParameter('foo', 'bar');
    String json = JSON.encode(original.toJson());
    Request request = new Request.fromString(json);
    expect(request.id, equals('one'));
    expect(request.method, equals('aMethod'));
    expect(request.getParameter('foo', null).asString(), equals('bar'));
  }

  void test_getParameter_defined() {
    String name = 'name';
    String value = 'value';
    Request request = new Request('0', '');
    request.setParameter(name, value);
    expect(request.getParameter(name, null).datum, equals(value));
  }

   void test_getParameter_null() {
    String name = 'name';
    Request request = new Request('0', '');
    request.setParameter(name, null);
    expect(request.getParameter(name, 'default').datum, equals(null));
  }

  void test_getParameter_undefined() {
    String name = 'name';
    String defaultValue = 'default value';
    Request request = new Request('0', '');
    expect(request.getParameter(name, defaultValue).datum, equals(
        defaultValue));
  }

  void test_getRequiredParameter_defined() {
    String name = 'name';
    String value = 'value';
    Request request = new Request('0', '');
    request.setParameter(name, value);
    expect(request.getRequiredParameter(name).datum, equals(value));
  }

   void test_getRequiredParameter_null() {
    String name = 'name';
    Request request = new Request('0', '');
    request.setParameter(name, null);
    expect(request.getRequiredParameter(name).datum, equals(null));
  }

  void test_getRequiredParameter_undefined() {
    String name = 'name';
    Request request = new Request('0', '');
    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
  }

  void test_toJson() {
    Request request = new Request('one', 'aMethod');
    expect(request.toJson(), equals({
      Request.ID: 'one',
      Request.METHOD: 'aMethod'
    }));
  }

  void test_toJson_withParams() {
    Request request = new Request('one', 'aMethod');
    request.setParameter('foo', 'bar');
    expect(request.toJson(), equals({
      Request.ID: 'one',
      Request.METHOD: 'aMethod',
      Request.PARAMS: {
        'foo': 'bar'
      }
    }));
  }
}


@ReflectiveTestCase()
class ResponseTest {
  void test_create_contextDoesNotExist() {
    Response response = new Response.contextDoesNotExist(new Request('0', ''));
    expect(response.id, equals('0'));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.ERROR: {
        'code': -1,
        'message': 'Context does not exist'
      }
    }));
  }

  void test_create_invalidRequestFormat() {
    Response response = new Response.invalidRequestFormat();
    expect(response.id, equals(''));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '',
      Response.ERROR: {
        'code': -4,
        'message': 'Invalid request'
      }
    }));
  }

  void test_create_missingRequiredParameter() {
    Response response = new Response.missingRequiredParameter(new Request('0',
        ''), 'x');
    expect(response.id, equals('0'));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.ERROR: {
        'code': -5,
        'message': 'Missing required parameter: x'
      }
    }));
  }

  void test_create_unanalyzedPriorityFiles() {
    Response response = new Response.unanalyzedPriorityFiles(new Request('0',
        ''), 'file list');
    expect(response.id, equals('0'));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.ERROR: {
        'code': -11,
        'message': "Unanalyzed files cannot be a priority: 'file list'"
      }
    }));
  }

  void test_create_unknownAnalysisOption() {
    Response response = new Response.unknownAnalysisOption(new Request('0', ''),
        'x');
    expect(response.id, equals('0'));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.ERROR: {
        'code': -6,
        'message': 'Unknown analysis option: "x"'
      }
    }));
  }

  void test_create_unknownRequest() {
    Response response = new Response.unknownRequest(new Request('0', ''));
    expect(response.id, equals('0'));
    expect(response.error, isNotNull);
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.ERROR: {
        'code': -7,
        'message': 'Unknown request'
      }
    }));
  }

  void test_fromJson() {
    Response original = new Response('myId');
    Response response = new Response.fromJson(original.toJson());
    expect(response.id, equals('myId'));
  }

  void test_fromJson_withError() {
    Response original = new Response.invalidRequestFormat();
    Response response = new Response.fromJson(original.toJson());
    expect(response.id, equals(''));
    expect(response.error, isNotNull);
    RequestError error = response.error;
    expect(error.code, equals(-4));
    expect(error.message, equals('Invalid request'));
  }

  void test_fromJson_withResult() {
    Response original = new Response('myId');
    original.setResult('foo', 'bar');
    Response response = new Response.fromJson(original.toJson());
    expect(response.id, equals('myId'));
    Map<String, Object> result = response.result;
    expect(result.length, equals(1));
    expect(result['foo'], equals('bar'));
  }

  void test_setResult() {
    String resultName = 'name';
    String resultValue = 'value';
    Response response = new Response('0');
    response.setResult(resultName, resultValue);
    expect(response.getResult(resultName), same(resultValue));
    expect(response.toJson(), equals({
      Response.ID: '0',
      Response.RESULT: {
        resultName: resultValue
      }
    }));
  }
}
