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

/// Class that represents some common Dart types.
///
/// TODO(ajcbik): generalize Dart types
///
class DartType {
  final String name;

  const DartType._withName(this.name);

  static const VOID = const DartType._withName('void');
  static const BOOL = const DartType._withName('bool');
  static const INT = const DartType._withName('int');
  static const DOUBLE = const DartType._withName('double');
  static const STRING = const DartType._withName('String');
  static const INT_LIST = const DartType._withName('List<int>');
  static const INT_STRING_MAP = const DartType._withName('Map<int, String>');

  // All value types.
  static const allTypes = [BOOL, INT, DOUBLE, STRING, INT_LIST, INT_STRING_MAP];
}

/// Class with interesting values for fuzzing.
class DartFuzzValues {
  // Interesting characters.
  static const List<String> interestingChars = [
    '\\u2665',
    '\\u{1f600}', // rune
  ];

  // Regular characters.
  static const regularChars =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#&()+- ';

  // Interesting doubles.
  static const interestingDoubles = [
    'double.infinity',
    'double.maxFinite',
    'double.minPositive',
    'double.nan',
    'double.negativeInfinity',
  ];

  // Interesting integer values.
  static const List<int> interestingIntegers = [
    0x0000000000000000,
    0x0000000000000001,
    0x000000007fffffff,
    0x0000000080000000,
    0x0000000080000001,
    0x00000000ffffffff,
    0x0000000100000000,
    0x0000000100000001,
    0x000000017fffffff,
    0x0000000180000000,
    0x0000000180000001,
    0x00000001ffffffff,
    0x7fffffff00000000,
    0x7fffffff00000001,
    0x7fffffff7fffffff,
    0x7fffffff80000000,
    0x7fffffff80000001,
    0x7fffffffffffffff,
    0x8000000000000000,
    0x8000000000000001,
    0x800000007fffffff,
    0x8000000080000000,
    0x8000000080000001,
    0x80000000ffffffff,
    0x8000000100000000,
    0x8000000100000001,
    0x800000017fffffff,
    0x8000000180000000,
    0x8000000180000001,
    0x80000001ffffffff,
    0xffffffff00000000,
    0xffffffff00000001,
    0xffffffff7fffffff,
    0xffffffff80000000,
    0xffffffff80000001,
    0xffffffffffffffff
  ];
}

/// Class that represents Dart library methods.
//
/// The invididual lists are organized by return type.
/// The proto string has the following format:
///    +-------> receiver type (V denotes none)
///    |+------> param1 type  (V denotes none, v denotes getter)
///    ||+-----> param2 type
///    |||+----> ....
///    ||||
///   "TTTT...."
/// where:
///   V void
///   v void (special)
///   B bool
///   I int
///   i int (small)
///   D double
///   S String
///   L List<int>
///   M Map<int, String>
///
/// TODO(ajcbik): generate these lists automatically
///
class DartLib {
  final String name;
  final String proto;
  const DartLib(this.name, this.proto);

  static const boolLibs = [
    DartLib('isEven', "Iv"),
    DartLib('isOdd', "Iv"),
    DartLib('isEmpty', "Sv"),
    DartLib('isEmpty', "Mv"),
    DartLib('isNotEmpty', "Sv"),
    DartLib('isNotEmpty', "Mv"),
    DartLib('endsWith', "SS"),
    DartLib('remove', "LI"),
    DartLib('containsValue', "MS"),
    DartLib('containsKey', "MI"),
  ];

  static const intLibs = [
    DartLib('bitLength', "Iv"),
    DartLib('sign', "Iv"),
    DartLib('abs', "IV"),
    DartLib('round', "IV"),
    DartLib('round', "DV"),
    DartLib('floor', "IV"),
    DartLib('floor', "DV"),
    DartLib('ceil', "IV"),
    DartLib('ceil', "DV"),
    DartLib('truncate', "IV"),
    DartLib('truncate', "DV"),
    DartLib('toInt', "DV"),
    DartLib('toUnsigned', "II"),
    DartLib('toSigned', "II"),
    DartLib('modInverse', "II"),
    DartLib('modPow', "III"),
    DartLib('length', "Sv"),
    DartLib('length', "Lv"),
    DartLib('length', "Mv"),
    DartLib('codeUnitAt', "SI"),
    DartLib('compareTo', "SS"),
    DartLib('removeLast', "LV"),
    DartLib('removeAt', "LI"),
    DartLib('indexOf', "LI"),
    DartLib('lastIndexOf', "LI"),
  ];

  static const doubleLibs = [
    DartLib('sign', "Dv"),
    DartLib('abs', "DV"),
    DartLib('toDouble', "IV"),
    DartLib('roundToDouble', "IV"),
    DartLib('roundToDouble', "DV"),
    DartLib('floorToDouble', "IV"),
    DartLib('floorToDouble', "DV"),
    DartLib('ceilToDouble', "IV"),
    DartLib('ceilToDouble', "DV"),
    DartLib('truncateToDouble', "IV"),
    DartLib('truncateToDouble', "DV"),
    DartLib('remainder', "DD"),
  ];

  static const stringLibs = [
    DartLib('toString', "BV"),
    DartLib('toString', "IV"),
    DartLib('toString', "DV"),
    DartLib('toRadixString', "II"),
    DartLib('trim', "SV"),
    DartLib('trimLeft', "SV"),
    DartLib('trimRight', "SV"),
    DartLib('toLowerCase', "SV"),
    DartLib('toUpperCase', "SV"),
    DartLib('substring', "SI"),
    DartLib('replaceRange', "SIIS"),
    DartLib('remove', "MI"),
    DartLib('padLeft', "Si"), // restrict!
    DartLib('padRight', "Si"), // restrict!
  ];

  static const intListLibs = [
    DartLib('sublist', "LI"),
  ];

  static const intStringMapLibs = [
    DartLib('Map.from', "VM"),
  ];
}
