// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// [START import]
import 'package:fidl_fuchsia_examples/fidl_async.dart' as fidl_examples;
// [END import]
import 'package:test/test.dart';

void main() {
  // [START bits]
  test('bits', () {
    expect(fidl_examples.FileMode.$none.$value, equals(0));
    expect(fidl_examples.FileMode.read.$value, equals(1));
    final readWrite =
        fidl_examples.FileMode.read | fidl_examples.FileMode.write;
    expect(readWrite.toString(), 'FileMode(3)');
  });
  // [END bits]

  // [START enums]
  test('enums', () {
    const museum = fidl_examples.LocationType.museum;
    expect(fidl_examples.LocationType(1), equals(museum));
    expect(fidl_examples.LocationType.$valueOf('museum'), equals(museum));
    expect(museum.toString(), 'LocationType(1)');
  });
  // [END enums]

  // [START structs]
  test('structs', () {
    final withDefaultName = fidl_examples.Color(id: 0);
    expect(withDefaultName.name, equals('red'));
    expect(withDefaultName.$fields, equals([0, 'red']));

    final blue = fidl_examples.Color(id: 1, name: 'blue');
    expect(blue == withDefaultName, equals(false));
    expect(blue.toString(), 'Color([1, blue])');

    final deepBlue = fidl_examples.Color.clone(blue, name: 'deep blue');
    expect(deepBlue.id, equals(1));
    expect(blue == deepBlue, equals(false));
  });
  // [END structs]

  // [START unions]
  test('unions', () {
    final intVal = fidl_examples.JsonValue.withIntValue(1);
    expect(intVal.$tag, equals(fidl_examples.JsonValueTag.intValue));
    expect(intVal.intValue, equals(1));
    expect(
        intVal == fidl_examples.JsonValue.withStringValue('1'), equals(false));

    expect(intVal.toString(), 'JsonValue(2: 1)');
  });
  // [END unions]

  // [START tables]
  test('tables', () {
    final user = fidl_examples.User();
    expect(user.age, equals(null));
    expect(user.name, equals(null));

    final fuchsia = fidl_examples.User(age: 100, name: 'fuchsia');
    expect(fuchsia.$fields, equals({2: 100, 3: 'fuchsia'}));
    expect(user == fuchsia, equals(false));
  });
  // [END tables]
}
