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

library fuzz_support;

import 'package:expect/expect.dart';
import 'dart:async';
import 'dart:io';

const typeMapping = const {
  'null': null,
  'int': 0,
  'int64': -9000000000000000000,
  'String': 'a',
  'FileMode': FileMode.read,
  'num': 0.50,
  'List<int>': const [1, 2, 3],
  'Map<String, int>': const {"a": 23}
};

typePermutations(int argCount) {
  var result = [];
  if (argCount == 2) {
    typeMapping.forEach((k, v) {
      typeMapping.forEach((k2, v2) {
        result.add([v, v2]);
      });
    });
  } else {
    Expect.isTrue(argCount == 3);
    typeMapping.forEach((k, v) {
      typeMapping.forEach((k2, v2) {
        typeMapping.forEach((k3, v3) {
          result.add([v, v2, v3]);
        });
      });
    });
  }
  return result;
}

// Perform sync operation and ignore all exceptions.
doItSync(Function f) {
  try {
    f();
  } catch (e) {}
}

// Perform async operation and transform the future for the operation
// into a future that never fails by treating errors as normal
// completion.
Future doItAsync(FutureOr f()) {
  // Ignore value and errors.
  return new Future.delayed(Duration.zero, f)
      .catchError((_) {})
      .then((_) => true);
}
