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

// ---- String.substring

/*member: substring1:Specializer=[substring]*/
@pragma('dart2js:noInline')
substring1(String param) {
  return param.substring(1);
}

/*member: substring2:Specializer=[substring]*/
@pragma('dart2js:noInline')
substring2(String param) {
  return param.substring(1, 3);
}

/*member: substring3:Specializer=[substring]*/
@pragma('dart2js:noInline')
substring3(String param) {
  dynamic s = param;
  return s.substring(1, 2); // Not confused by static type.
}

/*member: substring4:*/
@pragma('dart2js:noInline')
substring4(String param) {
  dynamic s = param;
  return s.substring(1, 2, 3); // Arity mismatch.
}

/*member: substring5:*/
@pragma('dart2js:noInline')
substring5(String param) {
  dynamic s = [param];
  return s.substring(1); // Receiver mismatch.
}

// ---- String.trim

/*member: trim1:Specializer=[trim]*/
@pragma('dart2js:noInline')
trim1(String param) {
  return param.trim();
}

// ---- String.indexOf

/*member: indexOf1:Specializer=[indexOf]*/
@pragma('dart2js:noInline')
indexOf1(String param) {
  return param.indexOf('e');
}

/*member: indexOf2:Specializer=[indexOf]*/
@pragma('dart2js:noInline')
indexOf2(String param) {
  return param.indexOf('e', 3);
}

// Specializer does not match as the pattern is not a string.
/*member: indexOf3:*/
@pragma('dart2js:noInline')
indexOf3(String param) {
  return param.indexOf(RegExp('e'));
}

// ---- String.contains

/*member: contains1:Specializer=[contains]*/
@pragma('dart2js:noInline')
contains1(String param) {
  return param.contains('e');
}

/*member: contains2:Specializer=[contains]*/
@pragma('dart2js:noInline')
contains2(String param) {
  return param.contains('e', 3);
}

// Specializer does not match as the pattern is not a string.
/*member: contains3:*/
@pragma('dart2js:noInline')
contains3(String param) {
  return param.contains(RegExp('e'));
}

// ---- String.startsWith

/*member: startsWith1:Specializer=[startsWith]*/
@pragma('dart2js:noInline')
startsWith1(String param) {
  return param.startsWith('e');
}

/*member: startsWith2:Specializer=[startsWith]*/
@pragma('dart2js:noInline')
startsWith2(String param) {
  return param.startsWith('e', 3);
}

// Specializer does not match as the pattern is not a string.
/*member: startsWith3:*/
@pragma('dart2js:noInline')
startsWith3(String param) {
  return param.startsWith(RegExp('e'));
}

// ---- String.endsWith

/*member: endsWith1:Specializer=[endsWith]*/
@pragma('dart2js:noInline')
endsWith1(String param) {
  return param.endsWith('e');
}

main() {
  substring1('hello');
  substring1('bye');
  substring1('');
  substring2('hello');
  substring2('bye');
  substring2('');
  substring3('hello');
  substring3('bye');
  substring3('');
  substring4('hello');
  substring4('bye');
  substring4('');
  substring5('hello');
  substring5('bye');
  substring5('');

  trim1('hello');
  trim1(' bye ');
  trim1('    ');

  indexOf1('hello');
  indexOf1('bye');
  indexOf2('hello');
  indexOf2('bye');
  indexOf3('hello');
  indexOf3('bye');

  contains1('hello');
  contains1('bye');
  contains2('hello');
  contains2('bye');
  contains3('hello');
  contains3('bye');

  startsWith1('hello');
  startsWith1('bye');
  startsWith2('hello');
  startsWith2('bye');
  startsWith3('hello');
  startsWith3('bye');

  endsWith1('hello');
  endsWith1('bye');
}
