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

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

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

// Suppress an analyzer warning for a deliberate type mismatch.
cast(x) => x;

void main() {
  test("checkItems works for messages", () {
    expect(() {
      TestAllTypes.$checkItem(new TestAllTypes());
    }, returnsNormally);

    expect(() {
      TestAllTypes.$checkItem(cast(new TestAllTypes_NestedMessage()));
    }, throwsATypeError);
  });

  test("checkItems works for groups", () {
    expect(() {
      TestAllTypes_RepeatedGroup.$checkItem(new TestAllTypes_RepeatedGroup());
    }, returnsNormally);

    expect(() {
      TestAllTypes_RepeatedGroup.$checkItem(
          cast(new TestAllTypes_OptionalGroup()));
    }, throwsATypeError);
  });

  test("checkItems works for enums", () {
    expect(() {
      TestAllTypes_NestedEnum.$checkItem(TestAllTypes_NestedEnum.FOO);
    }, returnsNormally);

    expect(() {
      TestAllTypes_NestedEnum.$checkItem(cast(ForeignEnum.FOREIGN_FOO));
    }, throwsATypeError);
  });

  test("check properties are initialized for repeated fields", () {
    var msg = new TestAllTypes();
    expect(
        (msg.info_.byName["repeatedNestedMessage"]
                as FieldInfo<TestAllTypes_NestedMessage>)
            .check,
        same(TestAllTypes_NestedMessage.$checkItem));

    expect(
        (msg.info_.byName["repeatedGroup"]
                as FieldInfo<TestAllTypes_RepeatedGroup>)
            .check,
        same(TestAllTypes_RepeatedGroup.$checkItem));

    expect(
        (msg.info_.byName["repeatedNestedEnum"]
                as FieldInfo<TestAllTypes_NestedEnum>)
            .check,
        same(TestAllTypes_NestedEnum.$checkItem));
  });
}
