// Copyright 2015 The Cobalt Authors. 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);
};
