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

/// @assertion 15.10.2.12: The production CharacterClassEscape :: s evaluates by
/// returning the set of characters containing the characters that are on the
/// right-hand side of the WhiteSpace (7.2) or LineTerminator (7.3) productions.
/// @description Checks that \s indeed matches all 26 whitespace and line
/// terminator characters but no others (tested vs all characters from the basic
/// plane)
/// @3rdparty sputnik-v1:S15.10.2.12_A1_T1.js-S15.10.2.12_A1_T5.js
/// @author rodionov
/// @Issue 1296

import "../../../../Utils/expect.dart";

main() {
  RegExp re = new RegExp("\\s");
  List<String> errors = <String>[];
  for (int alpha = 0x0000; alpha <= 0xFFFF; alpha++) {
    switch(alpha) {
      // white space as per chapter 7.2
      case 0x0009:
      case 0x000B:
      case 0x000C:
      case 0x0020:
      case 0x00A0:
      case 0xFEFF:
      // category Zs
      case 0x1680:
      case 0x2000:
      case 0x2001:
      case 0x2002:
      case 0x2003:
      case 0x2004:
      case 0x2005:
      case 0x2006:
      case 0x2007:
      case 0x2008:
      case 0x2009:
      case 0x200A:
      case 0x202F:
      case 0x205F:
      case 0x3000:
      // line terminators as per chapter 7.3
      case 0x000A:
      case 0x000D:
      case 0x2028:
      case 0x2029:
        if(null == re.firstMatch(new String.fromCharCodes([alpha]))) {
          errors.add("\\s !~ char($alpha)");
        }
        break;
      default:
        if(null != re.firstMatch(new String.fromCharCodes([alpha]))) {
          errors.add("\\s ~ char($alpha)");
        }
        break;
    }
  }
  if(errors.length > 0) {
    StringBuffer sb = new StringBuffer();
    sb.writeAll(errors, "\n");
    Expect.fail("\n" + sb.toString());
  }
}
