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

// @dart = 2.9

/// @assertion Future<List<InternetAddress>> lookup(String host,
///   { InternetAddressType type: InternetAddressType.any })
/// If [type] is [InternetAddressType.any], it will lookup both IP version 4
/// (IPv4) and IP version 6 (IPv6) addresses.
/// @description Checks that created [Future] contains IPv4 and IPv6 addresses
/// and each address string corresponds type of [InternetAddress] object.
/// [InternetAddressType.any].
/// @author iarkh@unipro.ru


import "../../../Utils/expect.dart";
import "dart:io";
import "dart:async";

RegExp ipv4 = new RegExp(r'^(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)\.(\d?\d?\d)$');
RegExp ipv6 = new RegExp(r'^::|^::1|^([a-fA-F0-9]{1,4}::?){1,7}([a-fA-F0-9]{1,4})$');

check(String name) {
  Future<List<InternetAddress>> list =
    InternetAddress.lookup(name, type: InternetAddressType.any);

  list.then((addresses) {
    addresses.forEach((InternetAddress addr) {
      if(addr.type == InternetAddressType.IPv4) {
        Expect.isTrue(ipv4.hasMatch(addr.address),
            "Address string does not correspond its type");
      } else {
        Expect.isTrue(ipv6.hasMatch(addr.address),
            "Address string does not correspond its type");
      }
    });
  }, onError: (e) { Expect.fail("Unexpected error appeared: $e"); });
}

main() {
  check("localhost");
  check("google.com");
}
