// Copyright (c) 2012, 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.

import 'dart:async';
import 'dart:collection' show Queue;

import 'package:http/http.dart' as http;
import 'package:http/testing.dart';
import 'package:oauth2/oauth2.dart' as oauth2;
import 'package:test/test.dart';

class ExpectClient extends MockClient {
  final Queue<MockClientHandler> _handlers;

  ExpectClient._(MockClientHandler fn)
      : _handlers = new Queue<MockClientHandler>(),
        super(fn);

  factory ExpectClient() {
    var client;
    client = new ExpectClient._((request) => client._handleRequest(request));
    return client;
  }

  void expectRequest(MockClientHandler fn) {
    var completer = new Completer();
    expect(completer.future, completes);

    _handlers.add((request) {
      completer.complete(null);
      return fn(request);
    });
  }

  Future<http.Response> _handleRequest(http.Request request) {
    if (_handlers.isEmpty) {
      return new Future.value(new http.Response('not found', 404));
    } else {
      return _handlers.removeFirst()(request);
    }
  }
}

/// A matcher for AuthorizationExceptions.
const isAuthorizationException = const _AuthorizationException();

/// A matcher for functions that throw AuthorizationException.
final Matcher throwsAuthorizationException = throwsA(isAuthorizationException);

class _AuthorizationException extends TypeMatcher {
  const _AuthorizationException() : super("AuthorizationException");
  bool matches(item, Map matchState) => item is oauth2.AuthorizationException;
}

/// A matcher for ExpirationExceptions.
const isExpirationException = const _ExpirationException();

/// A matcher for functions that throw ExpirationException.
final Matcher throwsExpirationException = throwsA(isExpirationException);

class _ExpirationException extends TypeMatcher {
  const _ExpirationException() : super("ExpirationException");
  bool matches(item, Map matchState) => item is oauth2.ExpirationException;
}
