// 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);
  }

  set onError(Function f) {
    _stub.onError = f;
  }

  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;

  conformanceImpl =
      new ConformanceTestInterfaceImpl(completer, pipe.endpoints[0]);
  conformanceImpl.onError = ((e) {
    assert(e is MojoCodecError);
    // TODO(zra): Make the error messages conform?
    // assert(e == expected);
    conformanceImpl.close();
    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;
  int r = pipe.endpoints[1].write(test.data, length, handles);
  assert(r == MojoResult.kOk);

  return completer.future.then((_) {
    assert(expected == "PASS");
    return conformanceImpl.close().then((_) {
      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=
  MojoHandle.reportLeakedHandles();
}
