// Copyright (c) 2013, 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:html';

import 'package:expect/minitest.dart';

main() {
  group('supported', () {
    test('supported', () {
      expect(RtcPeerConnection.supported, isTrue);
    });
  });

  group('functionality', () {
    // More thorough testing of this API requires the user to
    // explicitly click "allow this site to access my camera and/or microphone."
    // or particularly allow that site to always have those permission on each
    // computer the test is run. For more through tests, see
    // interactive_test.dart.
    if (RtcPeerConnection.supported) {
      test('peer connection', () {
        var pc = new RtcPeerConnection({
          'iceServers': [
            {'url': 'stun:216.93.246.18:3478'}
          ]
        });
        expect(pc is RtcPeerConnection, isTrue);
        // TODO(efortuna): Uncomment this test when RTCPeerConnection correctly
        // implements EventListener in Firefox (works correctly in nightly, so
        // it's coming!).
        //pc.onIceCandidate.listen((candidate) {});
      });

      test('ice candidate', () {
        var candidate =
            new RtcIceCandidate({'sdpMLineIndex': 1, 'candidate': 'hello'});
        expect(candidate is RtcIceCandidate, isTrue);
      });

      test('session description', () {
        var description =
            new RtcSessionDescription({'sdp': 'foo', 'type': 'offer'});
        expect(description is RtcSessionDescription, isTrue);
      });
    }
  });
}
