/* Copyright (c) 2013 The Chromium Authors. All rights reserved.
   Use of this source code is governed by a BSD-style license that can be
  found in the LICENSE file. */

/* Test Interface productions

Run with --test to generate an AST and verify that all comments accurately
reflect the state of the Nodes.

BUILD Type(Name)
This comment signals that a node of type <Type> is created with the
name <Name>.

ERROR Error String
This comment signals that a error of <Error String> is generated.  The error
is not assigned to a node, but are expected in order.

PROP Key=Value
This comment signals that a property has been set on the Node such that
<Key> = <Value>.

TREE
Type(Name)
  Type(Name)
  Type(Name)
    Type(Name)
    ...
This comment signals that a tree of nodes matching the BUILD comment
symatics should exist.  This is an exact match.
*/


/* TREE
 *Interface(MyIFace)
 */
interface MyIFace { };

/* TREE
 *Interface(MyIFaceInherit)
 *  Inherit(Foo)
 */
interface MyIFaceInherit : Foo {};

/* TREE
 *Interface(MyIFacePartial)
 */
partial interface MyIFacePartial { };

/* ERROR Unexpected ":" after identifier "MyIFaceInherit". */
partial interface MyIFaceInherit : Foo {};

/* TREE
 *Interface(MyIFaceMissingArgument)
 *  Operation(foo)
 *    Arguments()
 *      Argument(arg)
 *        Type()
 *          PrimitiveType(DOMString)
 *      Error(Missing argument.)
 *    Type()
 *      PrimitiveType(void)
 */
interface MyIFaceMissingArgument {
  void foo(DOMString arg, );
};

/* TREE
 *Interface(MyIFaceBig)
 *  Const(setString)
 *    PrimitiveType(DOMString)
 *    Value(NULL)
 */
interface MyIFaceBig {
  const DOMString? setString = null;
};

/* TREE
 *Interface(MyIfaceEmptySequenceDefalutValue)
 *  Operation(foo)
 *    Arguments()
 *      Argument(arg)
 *        Type()
 *          Sequence()
 *            Type()
 *              PrimitiveType(DOMString)
 *        Default()
 *    Type()
 *      PrimitiveType(void)
 */
interface MyIfaceEmptySequenceDefalutValue {
  void foo(optional sequence<DOMString> arg = []);
};

/* TREE
 *Interface(MyIFaceBig2)
 *  Const(nullValue)
 *    PrimitiveType(DOMString)
 *    Value(NULL)
 *  Const(longValue)
 *    PrimitiveType(long)
 *    Value(123)
 *  Const(longValue2)
 *    PrimitiveType(long long)
 *    Value(123)
 *  Attribute(myString)
 *    Type()
 *      PrimitiveType(DOMString)
 *  Attribute(readOnlyString)
 *    Type()
 *      PrimitiveType(DOMString)
 *  Attribute(staticString)
 *    Type()
 *      PrimitiveType(DOMString)
 *  Operation(myFunction)
 *    Arguments()
 *      Argument(myLong)
 *        Type()
 *          PrimitiveType(long long)
 *    Type()
 *      PrimitiveType(void)
 *  Operation(staticFunction)
 *    Arguments()
 *      Argument(myLong)
 *        Type()
 *          PrimitiveType(long long)
 *    Type()
 *      PrimitiveType(void)
 */
interface MyIFaceBig2 {
  const DOMString? nullValue = null;
  const long longValue = 123;
  const long long longValue2 = 123;
  attribute DOMString myString;
  readonly attribute DOMString readOnlyString;
  static attribute DOMString staticString;
  void myFunction(long long myLong);
  static void staticFunction(long long myLong);
};


/* TREE
 *Interface(MyIFaceSpecials)
 *  Operation(set)
 *    Arguments()
 *      Argument(property)
 *        Type()
 *          PrimitiveType(DOMString)
 *    Type()
 *      PrimitiveType(void)
 *  Operation(_unnamed_)
 *    Arguments()
 *      Argument(property)
 *        Type()
 *          PrimitiveType(DOMString)
 *    Type()
 *      PrimitiveType(double)
 *  Operation(GetFiveSix)
 *    Arguments()
 *      Argument(arg)
 *        Type()
 *          Typeref(SomeType)
 *    Type()
 *      PrimitiveType(long long)
 *      Array(5)
 *        Array(6)
 */
interface MyIFaceSpecials {
  setter creator void set(DOMString property);
  getter double (DOMString property);
  long long [5][6] GetFiveSix(SomeType arg);
};

/* TREE
 *Interface(MyIFaceStringifiers)
 *  Stringifier()
 *  Stringifier()
 *    Operation(_unnamed_)
 *      Arguments()
 *      Type()
 *        PrimitiveType(DOMString)
 *  Stringifier()
 *    Operation(namedStringifier)
 *      Arguments()
 *      Type()
 *        PrimitiveType(DOMString)
 *  Stringifier()
 *    Attribute(stringValue)
 *      Type()
 *        PrimitiveType(DOMString)
 */
interface MyIFaceStringifiers {
  stringifier;
  stringifier DOMString ();
  stringifier DOMString namedStringifier();
  stringifier attribute DOMString stringValue;
};

/* TREE
 *Interface(MyExtendedAttributeInterface)
 *  Operation(method)
 *    Arguments()
 *    Type()
 *      PrimitiveType(void)
 *    ExtAttributes()
 *      ExtAttribute(Attr)
 *      ExtAttribute(MethodIdentList)
 *  ExtAttributes()
 *    ExtAttribute(MyExtendedAttribute)
 *    ExtAttribute(MyExtendedIdentListAttribute)
 */
[MyExtendedAttribute,
 MyExtendedIdentListAttribute=(Foo, Bar, Baz)]
interface MyExtendedAttributeInterface {
  [Attr, MethodIdentList=(Foo, Bar)] void method();
};

/* TREE
 *Interface(MyIfacePromise)
 *  Operation(method1)
 *    Arguments()
 *    Type()
 *      Promise(Promise)
 *        Type()
 *          PrimitiveType(void)
 *  Operation(method2)
 *    Arguments()
 *    Type()
 *      Promise(Promise)
 *        Type()
 *          PrimitiveType(long)
 *  Operation(method3)
 *    Arguments()
 *    Type()
 *      Promise(Promise)
 *        Type()
 *          Any()
 *  Operation(method4)
 *    Arguments()
 *    Type()
 *      Promise(Promise)
 *        Type()
 *          Any()
 */
interface MyIfacePromise {
  Promise<void> method1();
  Promise<long> method2();
  Promise<any> method3();
  Promise method4();
};

/* TREE
 *Interface(MyIfaceIterable)
 *  Iterable()
 *    Type()
 *      PrimitiveType(long)
 *  Iterable()
 *    Type()
 *      PrimitiveType(double)
 *    Type()
 *      PrimitiveType(DOMString)
 *  LegacyIterable()
 *    Type()
 *      PrimitiveType(boolean)
 */
interface MyIfaceIterable {
  iterable<long>;
  iterable<double, DOMString>;
  legacyiterable<boolean>;
};

/* TREE
 *Interface(MyIfaceMaplike)
 *  Maplike()
 *    Type()
 *      PrimitiveType(long)
 *    Type()
 *      PrimitiveType(DOMString)
 *  Maplike()
 *    Type()
 *      PrimitiveType(double)
 *    Type()
 *      PrimitiveType(boolean)
 */
interface MyIfaceMaplike {
  readonly maplike<long, DOMString>;
  maplike<double, boolean>;
};

/* TREE
 *Interface(MyIfaceSetlike)
 *  Setlike()
 *    Type()
 *      PrimitiveType(long)
 *  Setlike()
 *    Type()
 *      PrimitiveType(double)
 */
interface MyIfaceSetlike {
  readonly setlike<long>;
  setlike<double>;
};
