/* 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 Enum 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
 *Enum(MealType1)
 *  EnumItem(rice)
 *  EnumItem(noodles)
 *  EnumItem(other)
*/
enum MealType1 {
  /* BUILD EnumItem (rice) */
  "rice",
  /* BUILD EnumItem (noodles) */
  "noodles",
  /* BUILD EnumItem(other) */
  "other"
};

/* BUILD Error(Enum missing name.) */
/* ERROR Enum missing name. */
enum {
  "rice",
  "noodles",
  "other"
};

/* TREE
 *Enum(MealType2)
 *  EnumItem(rice)
 *  EnumItem(noodles)
 *  EnumItem(other)
*/
enum MealType2 {
  /* BUILD EnumItem(rice) */
  "rice",
  /* BUILD EnumItem(noodles) */
  "noodles",
  /* BUILD EnumItem(other) */
  "other"
};

/* TREE
 *Enum(TrailingComma)
 *  EnumItem(rice)
 *  EnumItem(noodles)
 *  EnumItem(other)
*/
enum TrailingComma {
  "rice",
  "noodles",
  "other",
};

/* BUILD Error(Unexpected string "noodles" after string "rice".) */
/* ERROR Unexpected string "noodles" after string "rice". */
enum MissingComma {
  "rice"
  "noodles",
  "other"
};

/* BUILD Error(Unexpected "," after ",".) */
/* ERROR Unexpected "," after ",". */
enum ExtraComma {
  "rice",
  "noodles",
  ,"other",
};

/* BUILD Error(Unexpected keyword "interface" after "{".) */
/* ERROR Unexpected keyword "interface" after "{". */
enum ExtraComma {
  interface,
  "noodles",
  ,"other",
};

/* BUILD Error(Unexpected identifier "somename" after "{".) */
/* ERROR Unexpected identifier "somename" after "{". */
enum ExtraComma {
  somename,
  "noodles",
  ,"other",
};

/* BUILD Enum(MealType3) */
enum MealType3 {
  /* BUILD EnumItem(rice) */
  "rice",
  /* BUILD EnumItem(noodles) */
  "noodles",
  /* BUILD EnumItem(other) */
  "other"
};

