// 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.services.src.index.store.codec;

import 'package:analysis_services/index/index.dart';
import 'package:analysis_services/src/index/store/codec.dart';
import 'package:analysis_testing/mocks.dart';
import 'package:analysis_testing/reflective_tests.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:unittest/unittest.dart';

import '../abstract_single_unit.dart';


main() {
  groupSep = ' | ';
  group('ContextCodec', () {
    runReflectiveTests(_ContextCodecTest);
  });
  group('ElementCodec', () {
    runReflectiveTests(_ElementCodecTest);
  });
  group('RelationshipCodec', () {
    runReflectiveTests(_RelationshipCodecTest);
  });
  group('StringCodec', () {
    runReflectiveTests(_StringCodecTest);
  });
}


@ReflectiveTestCase()
class _ContextCodecTest {
  ContextCodec codec = new ContextCodec();

  void test_encode_decode() {
    AnalysisContext contextA = new MockAnalysisContext('contextA');
    AnalysisContext contextB = new MockAnalysisContext('contextB');
    int idA = codec.encode(contextA);
    int idB = codec.encode(contextB);
    expect(idA, codec.encode(contextA));
    expect(idB, codec.encode(contextB));
    expect(codec.decode(idA), contextA);
    expect(codec.decode(idB), contextB);
  }

  void test_remove() {
    // encode
    {
      AnalysisContext context = new MockAnalysisContext('context');
      // encode
      int id = codec.encode(context);
      expect(id, 0);
      expect(codec.decode(id), context);
      // remove
      codec.remove(context);
      expect(codec.decode(id), isNull);
    }
    // encode again
    {
      AnalysisContext context = new MockAnalysisContext('context');
      // encode
      int id = codec.encode(context);
      expect(id, 1);
      expect(codec.decode(id), context);
    }
  }
}


@ReflectiveTestCase()
class _ElementCodecTest extends AbstractSingleUnitTest {
  ElementCodec codec;
  AnalysisContext context = new MockAnalysisContext('context');
  StringCodec stringCodec = new StringCodec();

  void setUp() {
    super.setUp();
    codec = new ElementCodec(stringCodec);
  }

  void test_field() {
    resolveTestUnit('''
class A {
  int field;
}
''');
    FieldElement field = findElement('field', ElementKind.FIELD);
    PropertyAccessorElement getter = field.getter;
    PropertyAccessorElement setter = field.setter;
    {
      int id = codec.encode(getter);
      expect(codec.decode(context, id), getter);
    }
    {
      int id = codec.encode(setter);
      expect(codec.decode(context, id), setter);
    }
    {
      int id = codec.encode(field);
      expect(codec.decode(context, id), field);
    }
  }

  void test_localLocalVariable() {
    resolveTestUnit('''
main() {
  {
    foo() {
      int bar; // A
    }
  }
  {
    foo() {
      int bar; // B
    }
  }
}
''');
    {
      LocalVariableElement element = findNodeElementAtString('bar; // A', null);
      int id = codec.encode(element);
      expect(codec.decode(context, id), element);
    }
    {
      LocalVariableElement element = findNodeElementAtString('bar; // B', null);
      int id = codec.encode(element);
      expect(codec.decode(context, id), element);
    }
    // check strings, "foo" as a single string, no "foo@17" or "bar@35"
    expect(stringCodec.nameToIndex, hasLength(4));
    expect(stringCodec.nameToIndex, containsPair('f/test.dart', 0));
    expect(stringCodec.nameToIndex, containsPair('main', 1));
    expect(stringCodec.nameToIndex, containsPair('foo', 2));
    expect(stringCodec.nameToIndex, containsPair('bar', 3));
  }

  void test_localVariable() {
    resolveTestUnit('''
main() {
  {
    int foo; // A
  }
  {
    int foo; // B
  }
}
''');
    {
      LocalVariableElement element = findNodeElementAtString('foo; // A', null);
      int id = codec.encode(element);
      expect(codec.decode(context, id), element);
    }
    {
      LocalVariableElement element = findNodeElementAtString('foo; // B', null);
      int id = codec.encode(element);
      expect(codec.decode(context, id), element);
    }
    // check strings, "foo" as a single string, no "foo@21" or "foo@47"
    expect(stringCodec.nameToIndex, hasLength(3));
    expect(stringCodec.nameToIndex, containsPair('f/test.dart', 0));
    expect(stringCodec.nameToIndex, containsPair('main', 1));
    expect(stringCodec.nameToIndex, containsPair('foo', 2));
  }

  void test_notLocal() {
    resolveTestUnit('''
main() {
  int foo;
}
''');
    LocalVariableElement element = findElement('foo');
    int id = codec.encode(element);
    expect(codec.encode(element), id);
    expect(codec.decode(context, id), element);
    // check strings
    expect(stringCodec.nameToIndex, hasLength(3));
    expect(stringCodec.nameToIndex, containsPair('f/test.dart', 0));
    expect(stringCodec.nameToIndex, containsPair('main', 1));
    expect(stringCodec.nameToIndex, containsPair('foo', 2));
  }
}


@ReflectiveTestCase()
class _RelationshipCodecTest {
  StringCodec stringCodec = new StringCodec();
  RelationshipCodec codec;

  void setUp() {
    codec = new RelationshipCodec(stringCodec);
  }

  void test_all() {
    Relationship relationship = Relationship.getRelationship('my-relationship');
    int id = codec.encode(relationship);
    expect(codec.decode(id), relationship);
  }
}


@ReflectiveTestCase()
class _StringCodecTest {
  StringCodec codec = new StringCodec();

  void test_all() {
    int idA = codec.encode('aaa');
    int idB = codec.encode('bbb');
    expect(codec.decode(idA), 'aaa');
    expect(codec.decode(idB), 'bbb');
  }
}
