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

import 'dart:async';
import 'dart:convert';
import 'dart:isolate';
import 'dart:mojo.builtin' as builtin;
import 'dart:typed_data';

import 'package:_testing/validation_test_input_parser.dart' as parser;
import 'package:mojo/bindings.dart';
import 'package:mojo/core.dart';
import 'package:mojom/mojo/test/validation_test_interfaces.mojom.dart';

class ConformanceTestInterfaceImpl implements ConformanceTestInterface {
  ConformanceTestInterfaceStub _stub;
  Completer _completer;

  ConformanceTestInterfaceImpl(
      this._completer, MojoMessagePipeEndpoint endpoint) {
    _stub = new ConformanceTestInterfaceStub.fromEndpoint(endpoint, this);
  }

  void _complete() => _completer.complete(null);

  method0(double param0) => _complete();
  method1(StructA param0) => _complete();
  method2(StructB param0, StructA param1) => _complete();
  method3(List<bool> param0) => _complete();
  method4(StructC param0, List<int> param1) => _complete();
  method5(StructE param0, MojoDataPipeProducer param1) {
    param1.handle.close();
    param0.dataPipeConsumer.handle.close();
    param0.structD.messagePipes.forEach((h) => h.close());
    _complete();
  }
  method6(List<List<int>> param0) => _complete();
  method7(StructF param0, List<List<int>> param1) => _complete();
  method8(List<List<String>> param0) => _complete();
  method9(List<List<MojoHandle>> param0) {
    if (param0 != null) {
      param0.forEach((l) => l.forEach((h) {
        if (h != null) h.close();
      }));
    }
    _complete();
  }
  method10(Map<String, int> param0) => _complete();
  method11(StructG param0) => _complete();
  method12(double param0, [Function responseFactory]) {
    // If there are ever any passing method12 tests added, then this may need
    // to change.
    assert(responseFactory != null);
    _complete();
    return new Future.value(responseFactory(0.0));
  }
  method13(InterfaceAProxy param0, int param1, InterfaceAProxy param2) {
    if (param0 != null) param0.close(immediate: true);
    if (param2 != null) param2.close(immediate: true);
    _complete();
  }
  method14(UnionA param0) => _complete();
  method15(StructH param0) => _complete();

  Future close({bool immediate: false}) => _stub.close(immediate: immediate);
}

Future runTest(
    String name, parser.ValidationParseResult test, String expected) {
  var handles = new List.generate(
      test.numHandles, (_) => new MojoSharedBuffer.create(10).handle);
  var pipe = new MojoMessagePipe();
  var completer = new Completer();
  var conformanceImpl;

  runZoned(() {
    conformanceImpl =
        new ConformanceTestInterfaceImpl(completer, pipe.endpoints[0]);
  }, onError: (e, stackTrace) {
    assert(e is MojoCodecError);
    // TODO(zra): Make the error messages conform?
    // assert(e == expected);
    conformanceImpl.close(immediate: true);
    pipe.endpoints[0].close();
    pipe.endpoints[1].close();
    handles.forEach((h) => h.close());
    completer.completeError(null);
  });

  var length = (test.data == null) ? 0 : test.data.lengthInBytes;
  var r = pipe.endpoints[1].write(test.data, length, handles);
  assert(r.isOk);

  return completer.future.then((_) {
    assert(expected == "PASS");
    conformanceImpl.close();
    pipe.endpoints[0].close();
    pipe.endpoints[1].close();
    handles.forEach((h) => h.close());
  }, onError: (e) {
    // Do nothing.
  });
}

main(List args) async {
  assert(args.length == 3);
  List<String> testData = args[2];

  // First test the parser.
  parser.parserTests();

  // See CollectTests in validation_unittest.cc for information on testData
  // format.
  for (var i = 0; i < testData.length; i += 3) {
    var name = testData[i + 0];
    var data = testData[i + 1].trim();
    var expected = testData[i + 2].trim();
    try {
      await runTest(name, parser.parse(data), expected);
      print('$name PASSED.');
    } catch (e) {
      print('$name FAILED: $e');
    }
  }
  // TODO(zra): Add integration tests when they no longer rely on Client=
  assert(MojoHandle.reportLeakedHandles());
}
