#!/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 hash_code_tests;

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

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

void main() {
  test('testHashCodeEmptyMessage', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeOptionalInt32', () {
    var m1 = TestAllTypes()..optionalInt32 = 42;
    var m2 = TestAllTypes()..optionalInt32 = 42;
    expect(m1.hashCode, m2.hashCode);

    m1.optionalInt32 = 43;
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.optionalInt32 = 43;
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeOptionalInt64', () {
    var m1 = TestAllTypes()..optionalInt64 = Int64(42);
    var m2 = TestAllTypes()..optionalInt64 = Int64(42);
    expect(m1.hashCode, m2.hashCode);

    m1.optionalInt64 = Int64(43);
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.optionalInt64 = Int64(43);
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeOptionalString', () {
    var m1 = TestAllTypes()..optionalString = "Dart";
    var m2 = TestAllTypes()..optionalString = "Dart";
    expect(m1.hashCode, m2.hashCode);

    m1.optionalString = "JavaScript";
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.optionalString = "JavaScript";
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeOptionalEnum', () {
    var m1 = TestAllTypes()..optionalNestedEnum = TestAllTypes_NestedEnum.BAR;
    var m2 = TestAllTypes()..optionalNestedEnum = TestAllTypes_NestedEnum.BAR;
    expect(m1.hashCode, m2.hashCode);

    m1.optionalNestedEnum = TestAllTypes_NestedEnum.BAZ;
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.optionalNestedEnum = TestAllTypes_NestedEnum.BAZ;
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeRepeatedInt32', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    m1.repeatedInt32.add(42);
    m2.repeatedInt32.add(42);
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeRepeatedInt64', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    m1.repeatedInt32.add(42);
    m2.repeatedInt32.add(42);
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedInt32.add(43);
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.repeatedInt32.add(43);
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedInt32.clear();
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.repeatedInt32.clear();
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeRepeatedString', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    m1.repeatedString.add("Dart");
    m2.repeatedString.add("Dart");
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedString.add("JavaScript");
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.repeatedString.add("JavaScript");
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedString.clear();
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.repeatedString.clear();
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeRepeatedEnum', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    m1.repeatedNestedEnum.add(TestAllTypes_NestedEnum.BAR);
    m2.repeatedNestedEnum.add(TestAllTypes_NestedEnum.BAR);
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedNestedEnum.add(TestAllTypes_NestedEnum.BAZ);
    expect(m1.hashCode, isNot(m2.hashCode));

    m2.repeatedNestedEnum.add(TestAllTypes_NestedEnum.BAZ);
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeUnknownFields', () {
    var m1 = TestAllTypes();
    var m2 = TestAllTypes();
    m1.unknownFields.mergeVarintField(12345, Int64(123));
    m2.unknownFields.mergeVarintField(12345, Int64(123));
    expect(m1.hashCode, m2.hashCode);
  });

  test('testHashCodeCombined', () {
    var m1 = TestAllTypes()
      ..optionalInt32 = 42
      ..optionalInt64 = Int64(42)
      ..optionalString = "Dart"
      ..optionalNestedEnum = TestAllTypes_NestedEnum.BAR;
    var m2 = TestAllTypes()
      ..optionalInt32 = 42
      ..optionalInt64 = Int64(42)
      ..optionalString = "Dart"
      ..optionalNestedEnum = TestAllTypes_NestedEnum.BAR;
    expect(m1.hashCode, m2.hashCode);

    m1.repeatedInt32..add(42)..add(43);
    m2.repeatedInt32..add(42)..add(43);
    m1.repeatedInt64..add(Int64(42))..add(Int64(43));
    m2.repeatedInt64..add(Int64(42))..add(Int64(43));
    m1.repeatedString..add("Dart")..add("JavaScript");
    m2.repeatedString..add("Dart")..add("JavaScript");
    m1.repeatedNestedEnum
      ..add(TestAllTypes_NestedEnum.BAR)
      ..add(TestAllTypes_NestedEnum.BAZ);
    m2.repeatedNestedEnum
      ..add(TestAllTypes_NestedEnum.BAR)
      ..add(TestAllTypes_NestedEnum.BAZ);
    expect(m1.hashCode, m2.hashCode);

    m1.unknownFields.mergeVarintField(12345, Int64(123));
    m2.unknownFields.mergeVarintField(12345, Int64(123));
    expect(m1.hashCode, m2.hashCode);
    expect(m1.hashCode, m2.hashCode);
  });
}
