#!/usr/bin/env dart
// Copyright (c) 2013, 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 unknown_field_set_test;

import 'package:protobuf/protobuf.dart';
import 'package:test/test.dart';

import '../out/protos/google/protobuf/unittest.pb.dart';

import 'test_util.dart';

void main() {
  TestAllTypes testAllTypes = getAllSet();
  List<int> allFieldsData = testAllTypes.writeToBuffer();
  TestEmptyMessage emptyMessage =
      new TestEmptyMessage.fromBuffer(allFieldsData);
  UnknownFieldSet unknownFields = emptyMessage.unknownFields;

  UnknownFieldSetField getField(String name) {
    int tagNumber = testAllTypes.getTagNumber(name);
    assert(unknownFields.hasField(tagNumber));
    return unknownFields.getField(tagNumber);
  }

  /**
   * Asserts that the given field sets are not equal and have different
   * hash codes.
   *
   * N.B.: It is valid for non-equal objects to have the same hash code, so
   * this test is more strict than necessary. However, in the test cases
   * identifies, the hash codes should differ, and as a matter of principle
   * hash collisions should be relatively rare.
   */
  void _checkNotEqual(UnknownFieldSet s1, UnknownFieldSet s2) {
    expect(s1 == s2, isFalse);
    expect(s2 == s1, isFalse);

    expect(s1.hashCode == s2.hashCode, isFalse,
        reason: '${s1.toString()} should have a different hash code '
            'from ${s2.toString()}');
  }

  /**
   * Asserts that the given field sets are equal and have identical hash codes.
   */
  void _checkEqualsIsConsistent(UnknownFieldSet set) {
    // Object should be equal to itself.
    expect(set, set);

    // Object should be equal to a copy of itself.
    UnknownFieldSet copy = set.clone();
    expect(copy, set);
    expect(set, copy);
  }

  test('testVarint', () {
    UnknownFieldSetField optionalInt32 = getField('optionalInt32');
    expect(optionalInt32.varints[0], expect64(testAllTypes.optionalInt32));
  });

  test('testFixed32', () {
    UnknownFieldSetField optionalFixed32 = getField('optionalFixed32');
    expect(optionalFixed32.fixed32s[0], testAllTypes.optionalFixed32);
  });

  test('testFixed64', () {
    UnknownFieldSetField optionalFixed64 = getField('optionalFixed64');
    expect(optionalFixed64.fixed64s[0], testAllTypes.optionalFixed64);
  });

  test('testLengthDelimited', () {
    UnknownFieldSetField optionalBytes = getField('optionalBytes');
    expect(optionalBytes.lengthDelimited[0], testAllTypes.optionalBytes);
  });

  test('testGroup', () {
    int tagNumberA = new TestAllTypes_OptionalGroup().getTagNumber('a');
    expect(tagNumberA != null, isTrue);

    UnknownFieldSetField optionalGroupField = getField('optionalGroup');
    expect(optionalGroupField.groups.length, 1);
    UnknownFieldSet group = optionalGroupField.groups[0];
    expect(group.hasField(tagNumberA), isTrue);
    expect(group.getField(tagNumberA).varints[0],
        expect64(testAllTypes.optionalGroup.a));
  });

  test('testSerialize', () {
    expect(emptyMessage.writeToBuffer(), allFieldsData);
  });

  test('testCopyFrom', () {
    TestEmptyMessage message = emptyMessage.clone();
    expect(message.toString(), emptyMessage.toString());
    expect(emptyMessage.toString().isEmpty, isFalse);
  });

  test('testMergeFrom', () {
    // Source.
    UnknownFieldSet sourceFieldSet = new UnknownFieldSet()
      ..addField(2, new UnknownFieldSetField()..addVarint(make64(2)))
      ..addField(3, new UnknownFieldSetField()..addVarint(make64(3)));

    TestEmptyMessage source = new TestEmptyMessage()
      ..mergeUnknownFields(sourceFieldSet);

    // Destination.
    UnknownFieldSet destinationFieldSet = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addVarint(make64(1)))
      ..addField(3, new UnknownFieldSetField()..addVarint(make64(4)));

    TestEmptyMessage destination = new TestEmptyMessage()
      ..mergeUnknownFields(destinationFieldSet)
      ..mergeFromMessage(source);

    expect(
        destination.toString(),
        '1: 1\n'
        '2: 2\n'
        '3: 4\n'
        '3: 3\n');
  });

  test('testClear', () {
    UnknownFieldSet fsb = unknownFields.clone()..clear();
    expect(fsb.asMap(), isEmpty);
  });

  test('testEmpty', () {
    expect(new UnknownFieldSet().asMap(), isEmpty);
  });

  test('testClearMessage', () {
    TestEmptyMessage message = emptyMessage.clone();
    message.clear();
    expect(message.writeToBuffer(), isEmpty);
  });

  test('testParseKnownAndUnknown', () {
    // Test mixing known and unknown fields when parsing.
    UnknownFieldSet fields = unknownFields.clone()
      ..addField(123456, new UnknownFieldSetField()..addVarint(make64(654321)));

    CodedBufferWriter writer = new CodedBufferWriter();
    fields.writeToCodedBufferWriter(writer);

    TestAllTypes destination = new TestAllTypes.fromBuffer(writer.toBuffer());

    assertAllFieldsSet(destination);
    expect(destination.unknownFields.asMap().length, 1);

    UnknownFieldSetField field = destination.unknownFields.getField(123456);
    expect(field.varints.length, 1);
    expect(field.varints[0], expect64(654321));
  });

  // Constructs a protocol buffer which contains fields with all the same
  // numbers as allFieldsData except that each field is some other wire
  // type.
  List<int> getBizarroData() {
    UnknownFieldSet bizarroFields = new UnknownFieldSet();

    UnknownFieldSetField varintField = new UnknownFieldSetField()
      ..addVarint(make64(1));

    UnknownFieldSetField fixed32Field = new UnknownFieldSetField()
      ..addFixed32(1);

    unknownFields.asMap().forEach((int tag, UnknownFieldSetField value) {
      if (value.varints.isEmpty) {
        // Original field is not a varint, so use a varint.
        bizarroFields.addField(tag, varintField);
      } else {
        // Original field *is* a varint, so use something else.
        bizarroFields.addField(tag, fixed32Field);
      }
    });
    CodedBufferWriter writer = new CodedBufferWriter();
    bizarroFields.writeToCodedBufferWriter(writer);
    return writer.toBuffer();
  }

  test('testWrongTypeTreatedAsUnknown', () {
    // Test that fields of the wrong wire type are treated like unknown fields
    // when parsing.
    List<int> bizarroData = getBizarroData();
    TestAllTypes allTypesMessage = new TestAllTypes.fromBuffer(bizarroData);
    TestEmptyMessage emptyMessage_ =
        new TestEmptyMessage.fromBuffer(bizarroData);
    // All fields should have been interpreted as unknown, so the debug strings
    // should be the same.
    expect(allTypesMessage.toString(), emptyMessage_.toString());
  });

  test('testUnknownExtensions', () {
    // Make sure fields are properly parsed to the UnknownFieldSet even when
    // they are declared as extension numbers.
    TestEmptyMessageWithExtensions message =
        new TestEmptyMessageWithExtensions.fromBuffer(allFieldsData);

    expect(message.unknownFields.asMap().length, unknownFields.asMap().length);
    expect(message.writeToBuffer(), allFieldsData);
  });

  test('testWrongExtensionTypeTreatedAsUnknown', () {
    // Test that fields of the wrong wire type are treated like unknown fields
    // when parsing extensions.

    List<int> bizarroData = getBizarroData();
    TestAllExtensions allExtensionsMessage =
        new TestAllExtensions.fromBuffer(bizarroData);
    TestEmptyMessage emptyMessage_ =
        new TestEmptyMessage.fromBuffer(bizarroData);

    // All fields should have been interpreted as unknown, so the debug strings
    // should be the same.
    expect(allExtensionsMessage.toString(), emptyMessage_.toString());
  });

  test('testParseUnknownEnumValue', () {
    int singularFieldNum = testAllTypes.getTagNumber('optionalNestedEnum');
    int repeatedFieldNum = testAllTypes.getTagNumber('repeatedNestedEnum');
    expect(singularFieldNum, isNotNull);
    expect(repeatedFieldNum, isNotNull);

    UnknownFieldSet fieldSet = new UnknownFieldSet()
      ..addField(
          singularFieldNum,
          new UnknownFieldSetField()
            ..addVarint(make64(TestAllTypes_NestedEnum.BAR.value))
            ..addVarint(make64(5)))
      ..addField(
          repeatedFieldNum,
          new UnknownFieldSetField()
            ..addVarint(make64(TestAllTypes_NestedEnum.FOO.value))
            ..addVarint(make64(4))
            ..addVarint(make64(TestAllTypes_NestedEnum.BAZ.value))
            ..addVarint(make64(6)));

    CodedBufferWriter writer = new CodedBufferWriter();
    fieldSet.writeToCodedBufferWriter(writer);
    {
      TestAllTypes message = new TestAllTypes.fromBuffer(writer.toBuffer());
      expect(message.optionalNestedEnum, TestAllTypes_NestedEnum.BAR);
      expect(message.repeatedNestedEnum,
          [TestAllTypes_NestedEnum.FOO, TestAllTypes_NestedEnum.BAZ]);
      final singularVarints =
          message.unknownFields.getField(singularFieldNum).varints;
      expect(singularVarints.length, 1);
      expect(singularVarints[0], expect64(5));
      final repeatedVarints =
          message.unknownFields.getField(repeatedFieldNum).varints;
      expect(repeatedVarints.length, 2);
      expect(repeatedVarints[0], expect64(4));
      expect(repeatedVarints[1], expect64(6));
    }
    {
      TestAllExtensions message = new TestAllExtensions.fromBuffer(
          writer.toBuffer(), getExtensionRegistry());
      expect(message.getExtension(Unittest.optionalNestedEnumExtension),
          TestAllTypes_NestedEnum.BAR);

      expect(message.getExtension(Unittest.repeatedNestedEnumExtension),
          [TestAllTypes_NestedEnum.FOO, TestAllTypes_NestedEnum.BAZ]);
      final singularVarints =
          message.unknownFields.getField(singularFieldNum).varints;
      expect(singularVarints.length, 1);
      expect(singularVarints[0], expect64(5));
      final repeatedVarints =
          message.unknownFields.getField(repeatedFieldNum).varints;
      expect(repeatedVarints.length, 2);
      expect(repeatedVarints[0], expect64(4));
      expect(repeatedVarints[1], expect64(6));
    }
  });

  test('testLargeVarint', () {
    UnknownFieldSet unknownFieldSet = new UnknownFieldSet()
      ..addField(
          1,
          new UnknownFieldSetField()
            ..addVarint(make64(0x7FFFFFFF, 0xFFFFFFFF)));
    CodedBufferWriter writer = new CodedBufferWriter();
    unknownFieldSet.writeToCodedBufferWriter(writer);

    var parsed = new UnknownFieldSet()
      ..mergeFromCodedBufferReader(new CodedBufferReader(writer.toBuffer()));
    var field = parsed.getField(1);
    expect(field.varints.length, 1);
    expect(field.varints[0], expect64(0x7FFFFFFF, 0xFFFFFFFFF));
  });

  test('testEquals', () {
    UnknownFieldSet a = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addFixed32(1));

    UnknownFieldSet b = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addFixed64(make64(1)));

    UnknownFieldSet c = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addVarint(make64(1)));

    UnknownFieldSet d = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addLengthDelimited([]));

    UnknownFieldSet e = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addGroup(unknownFields));

    _checkEqualsIsConsistent(a);
    _checkEqualsIsConsistent(b);
    _checkEqualsIsConsistent(c);
    _checkEqualsIsConsistent(d);
    _checkEqualsIsConsistent(e);

    _checkNotEqual(a, b);
    _checkNotEqual(a, c);
    _checkNotEqual(a, d);
    _checkNotEqual(a, e);
    _checkNotEqual(b, c);
    _checkNotEqual(b, d);
    _checkNotEqual(b, e);
    _checkNotEqual(c, d);
    _checkNotEqual(c, e);
    _checkNotEqual(d, e);

    UnknownFieldSet f1 = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addLengthDelimited([1, 2]));
    UnknownFieldSet f2 = new UnknownFieldSet()
      ..addField(1, new UnknownFieldSetField()..addLengthDelimited([2, 1]));

    _checkEqualsIsConsistent(f1);
    _checkEqualsIsConsistent(f2);

    _checkNotEqual(f1, f2);
  });
}
