// 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);
};
