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