/* Copyright 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 ExtendedAttribute 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(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 *      Arguments()
 */

[foo()] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 *      Values()
 */

[foo(1)] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 *      Values()
 */

[foo(1 true 1.2e-3)] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 *      Arguments()
 *        Error(Unexpected ).)
 */

[foo(null)] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 */

[foo=1] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 */

[foo=true] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 */

[foo=1.2e-3] interface Foo {};

/* TREE
 *Interface(Foo)
 *  ExtAttributes()
 *    ExtAttribute(foo)
 */

[foo=(bar, baz)] interface Foo {};
