// Copyright (c) 2016, 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.
// VMOptions=
// VMOptions=--interpret_irregexp

import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';

var regex0;
var regex;

void script() {
  // Check the internal NUL doesn't trip up the name scrubbing in the vm.
  regex0 = new RegExp("with internal \u{0} NUL");
  regex = new RegExp(r"(\w+)");
  String str = "Parse my string";
  Iterable<Match> matches = regex.allMatches(str); // Run to generate bytecode.
  expect(matches.length, equals(3));
}

var tests = <IsolateTest>[
  (Isolate isolate) async {
    Library lib = isolate.rootLibrary;
    await lib.load();

    Field field0 = lib.variables.singleWhere((v) => v.name == 'regex0');
    await field0.load(); // No crash due to embedded NUL.

    Field field = lib.variables.singleWhere((v) => v.name == 'regex');
    await field.load();
    Instance regex = field.staticValue;
    expect(regex.isInstance, isTrue);
    expect(regex.isRegExp, isTrue);
    await regex.load();

    if (regex.oneByteFunction == null) {
      // Running with interpreted regexp.
      var b1 = await regex.oneByteBytecode.load();
      expect(b1.isTypedData, isTrue);
      var b2 = await regex.twoByteBytecode.load();
      expect(b2.isTypedData, isFalse); // No two-byte string subject was used.
    } else {
      // Running with compiled regexp.
      var f1 = await regex.oneByteFunction.load();
      expect(f1 is ServiceFunction, isTrue);
      var f2 = await regex.twoByteFunction.load();
      expect(f2 is ServiceFunction, isTrue);
      var f3 = await regex.externalOneByteFunction.load();
      expect(f3 is ServiceFunction, isTrue);
      var f4 = await regex.externalTwoByteFunction.load();
      expect(f4 is ServiceFunction, isTrue);
    }
  }
];

main(args) => runIsolateTests(args, tests, testeeBefore: script);
