// 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:mojo/dart/testing/validation_test_input_parser.dart' as parser;
import 'package:mojo/public/dart/bindings.dart';
import 'package:mojo/public/dart/core.dart';
import 'package:mojo/public/interfaces/bindings/tests/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) => _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) => _complete();
  method10(Map<String, int> param0) => _complete();
  method11(StructG param0) => _complete();

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

parser.ValidationParseResult readAndParseTest(String test) {
  List<int> data = builtin.readSync("${test}.data");
  String input = new Utf8Decoder().convert(data).trim();
  return parser.parse(input);
}

String expectedResult(String test) {
  List<int> data = builtin.readSync("${test}.expected");
  return new Utf8Decoder().convert(data).trim();
}

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(nodefer: true);
    pipe.endpoints[0].handle.close();
    handles.forEach((h) => h.close());
  });

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

  completer.future.then((_) {
    assert(expected == "PASS");
    conformanceImpl.close();
    pipe.endpoints[0].handle.close();
    handles.forEach((h) => h.close());
  });
}

Iterable<String> getTestFiles(String path, String prefix) => builtin
    .enumerateFiles(path)
    .where((s) => s.startsWith(prefix) && s.endsWith(".data"))
    .map((s) => s.replaceFirst('.data', ''));

main(List args) {
  int handle = args[0];
  String path = args[1];

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

  // Then run the conformance tests.
  getTestFiles(path, "$path/conformance_").forEach((test) {
    runTest(test, readAndParseTest(test), expectedResult(test));
  });
  // TODO(zra): Add integration tests when they no longer rely on Client=.
}
