/* 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(MyIFaceBig)
 *  Const(setString)
 *    PrimitiveType(DOMString)
 *    Value(NULL)
 */
interface MyIFaceBig {
  const DOMString? setString = null;
};

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