// Copyright (c) 2014, the Dart project authors. All rights reserved.
// Copyright 2013 the V8 project authors. All rights reserved.
// Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1.  Redistributions of source code must retain the above copyright
//     notice, this list of conditions and the following disclaimer.
// 2.  Redistributions in binary form must reproduce the above copyright
//     notice, this list of conditions and the following disclaimer in the
//     documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// @dart = 2.9

import 'v8_regexp_utils.dart';
import 'package:expect/expect.dart';

void main() {
  description(
      'Tests for bug <a href="https://bugs.webkit.org/show_bug.cgi?id=21232">#21232</a>, and related range issues described in bug.');

  // Basic test for ranges - one to three and five are in regexp, four is not, and '-' should not match
  var regexp01 = new RegExp(r"[1-35]+").firstMatch("-12354");
  shouldBe(regexp01, ["1235"]);
  // Tests inserting an escape character class into the above pattern - where the spaces fall within the
  // range it is no longer a range - hyphens should now match, two should not.
  var regexp01a = new RegExp(r"[\s1-35]+").firstMatch("-123 54");
  shouldBe(regexp01a, ["123 5"]);

  // These are invalid ranges, according to ECMA-262, but we allow them.
  var regexp01b = new RegExp(r"[1\s-35]+").firstMatch("21-3 54");
  shouldBe(regexp01b, ["1-3 5"]);
  var regexp01c = new RegExp(r"[1-\s35]+").firstMatch("21-3 54");
  shouldBe(regexp01c, ["1-3 5"]);

  var regexp01d = new RegExp(r"[1-3\s5]+").firstMatch("-123 54");
  shouldBe(regexp01d, ["123 5"]);
  var regexp01e = new RegExp(r"[1-35\s5]+").firstMatch("-123 54");
  shouldBe(regexp01e, ["123 5"]);
  // hyphens are normal characters if a range is not fully specified.
  var regexp01f = new RegExp(r"[-3]+").firstMatch("2-34");
  shouldBe(regexp01f, ["-3"]);
  var regexp01g = new RegExp(r"[2-]+").firstMatch("12-3");
  shouldBe(regexp01g, ["2-"]);

  // Similar to the above tests, but where the hyphen is escaped this is never a range.
  var regexp02 = new RegExp(r"[1\-35]+").firstMatch("21-354");
  shouldBe(regexp02, ["1-35"]);
  // As above.
  var regexp02a = new RegExp(r"[\s1\-35]+").firstMatch("21-3 54");
  shouldBe(regexp02a, ["1-3 5"]);
  var regexp02b = new RegExp(r"[1\s\-35]+").firstMatch("21-3 54");
  shouldBe(regexp02b, ["1-3 5"]);
  var regexp02c = new RegExp(r"[1\-\s35]+").firstMatch("21-3 54");
  shouldBe(regexp02c, ["1-3 5"]);
  var regexp02d = new RegExp(r"[1\-3\s5]+").firstMatch("21-3 54");
  shouldBe(regexp02d, ["1-3 5"]);
  var regexp02e = new RegExp(r"[1\-35\s5]+").firstMatch("21-3 54");
  shouldBe(regexp02e, ["1-3 5"]);

  // Test that an escaped hyphen can be used as a bound on a range.
  var regexp03a = new RegExp(r"[\--0]+").firstMatch(",-.01");
  shouldBe(regexp03a, ["-.0"]);
  var regexp03b = new RegExp(r"[+-\-]+").firstMatch("*+,-.");
  shouldBe(regexp03b, ["+,-"]);

  // The actual bug reported.
  var bug21232 =
      (new RegExp(r"^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$")).hasMatch('@');
  shouldBeFalse(bug21232);
}
