/* 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 = 1,
  /* BUILD EnumItem(other) */
  other
};

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

/* BUILD Error(Trailing comma in block.) */
/* ERROR Trailing comma in block. */
enum TrailingComma {
  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 string "somename" after "{".) */
/* ERROR Unexpected string "somename" after "{". */
enum ExtraComma {
  "somename",
  noodles,
  other,
};

/* BUILD Enum(MealType3) */
enum MealType3 {
  /* BUILD EnumItem(rice) */
  rice = 1 << 1,
  /* BUILD EnumItem(noodles) */
  noodles = 0x1 << 0x2,
  /* BUILD EnumItem(other) */
  other = 012 << 777
};

/* BUILD Enum(MealType4) */
enum MealType4 {
  /* BUILD EnumItem(rice) */
  rice = true,
  /* BUILD EnumItem(noodles) */
  noodles = false
};
