/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

interface OperationsTestInterface {
  void voidFunctionNoArgs();
  DOMString stringFunctionNoArgs();
  long longFunctionNoArgs();
  ArbitraryInterface objectFunctionNoArgs();
  void voidFunctionStringArg(DOMString arg);
  void voidFunctionLongArg(long arg);
  void voidFunctionObjectArg(ArbitraryInterface arg);
  void optionalArguments(long arg1, optional long arg2, optional long arg3);
  void optionalArgumentWithDefault(optional double arg1 = 2.718);
  void optionalNullableArgumentsWithDefaults(
      optional boolean? arg1 = null,
      optional ArbitraryInterface? arg2 = null);

  void variadicPrimitiveArguments(long... bools);
  void variadicStringArgumentsAfterOptionalArgument(
      optional boolean optional_arg, DOMString... strings);

  void overloadedFunction();
  void overloadedFunction(long arg);
  void overloadedFunction(DOMString arg);
  void overloadedFunction(long arg1, long arg2, long arg3);
  void overloadedFunction(long arg1, long arg2, ArbitraryInterface arg3);

  // double and long are not distinguishable, but because this is a static
  // function it is part of the same overload set as the one that takes long.
  static void overloadedFunction(double arg);
  static void overloadedFunction(double arg1, double arg2);

  void overloadedNullable(long arg);
  void overloadedNullable(boolean? arg);
};
