Adding unit tests. Minor code cleanup. Added folder "icons" to the list of files to include in the binary build.
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/KeywordHasValueMatcher.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/KeywordHasValueMatcher.java
new file mode 100644
index 0000000..be27bce
--- /dev/null
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/KeywordHasValueMatcher.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.junit;
+
+import org.eclipse.xtext.Keyword;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+/**
+ * Matches that verifies that a value of a <code>{@link Keyword}</code> is equal to the expected value.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class KeywordHasValueMatcher extends BaseMatcher<Keyword> {
+
+  private final String expectedValue;
+
+  public static KeywordHasValueMatcher hasValue(String expected) {
+    return new KeywordHasValueMatcher(expected);
+  }
+  
+  private KeywordHasValueMatcher(String expectedValue) {
+    this.expectedValue = expectedValue;
+  }
+  
+  public boolean matches(Object arg) {
+    if (!(arg instanceof Keyword)) return false;
+    Keyword keyword = (Keyword) arg;
+    return keyword.getValue().equals(expectedValue);
+  }
+
+  public void describeTo(Description description) {
+    description.appendValue(expectedValue);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java
new file mode 100644
index 0000000..9116109
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/CompoundElementsTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.grammar;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+
+/**
+ * Tests for <code>{@link CompoundElements}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class CompoundElementsTest {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  
+  private CompoundElements elements;
+  
+  @Before public void setUp() {
+    elements = xtext.getInstanceOf(CompoundElements.class);
+  }
+  
+  @Test public void should_return_default() {
+    assertThat(elements.defaultValue(), equalTo("default ="));
+  }
+  
+  @Test public void should_return_default_in_brackets() {
+    assertThat(elements.defaultValueInBrackets(), equalTo("[default =]"));
+  }
+  
+  @Test public void should_return_default_for_string() {
+    assertThat(elements.defaultStringValue(), equalTo("default = \"\""));
+  }
+  
+  @Test public void should_return_default_for_string_in_brackets() {
+    assertThat(elements.defaultStringValueInBrackets(), equalTo("[default = \"\"]"));
+  }
+
+  @Test public void should_return_empty_string() {
+    assertThat(elements.emptyString(), equalTo("\"\""));
+  }
+  
+  @Test public void should_return_packed() {
+    assertThat(elements.packed(), equalTo("packed = true"));
+  }
+  
+  @Test public void should_return_packed_in_brackets() {
+    assertThat(elements.packedInBrackets(), equalTo("[packed = true]"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java
new file mode 100644
index 0000000..47bbe46
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/grammar/KeywordsTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.grammar;
+
+import static com.google.eclipse.protobuf.junit.KeywordHasValueMatcher.hasValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+
+/**
+ * Tests for <code>{@link Keywords}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class KeywordsTest {
+
+  @Rule public XtextRule xtext = new XtextRule();
+
+  private Keywords keywords;
+  
+  @Before public void setUp() {
+    keywords = xtext.getInstanceOf(Keywords.class);
+  }
+  
+  @Test public void should_return_bool() {
+    assertThat(keywords.bool(), hasValue("bool"));
+  }
+
+  @Test public void should_return_true() {
+    assertThat(keywords.boolTrue(), hasValue("true"));
+  }
+
+  @Test public void should_return_false() {
+    assertThat(keywords.boolFalse(), hasValue("false"));
+  }
+  
+  @Test public void should_return_bytes() {
+    assertThat(keywords.bytes(), hasValue("bytes"));
+  }
+  
+  @Test public void should_return_opening_bracket() {
+    assertThat(keywords.openingBracket(), hasValue("["));
+  }
+  
+  @Test public void should_return_closing_bracket() {
+    assertThat(keywords.closingBracket(), hasValue("]"));
+  }
+
+  @Test public void should_return_default() {
+    assertThat(keywords.defaultValue(), hasValue("default"));
+  }
+  
+  @Test public void should_return_equal_sign() {
+    assertThat(keywords.equalSign(), hasValue("="));
+  }
+
+  @Test public void should_return_packed() {
+    assertThat(keywords.packed(), hasValue("packed"));
+  }
+
+  @Test public void should_return_semicolon() {
+    assertThat(keywords.semicolon(), hasValue(";"));
+  }
+
+  @Test public void should_return_string() {
+    assertThat(keywords.string(), hasValue("string"));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/build.properties b/com.google.eclipse.protobuf.ui/build.properties
index 300fb1a..0d2ea5b 100644
--- a/com.google.eclipse.protobuf.ui/build.properties
+++ b/com.google.eclipse.protobuf.ui/build.properties
@@ -3,4 +3,5 @@
 bin.includes = META-INF/,\
                .,\
                plugin.xml,\
-               OSGI-INF/
+               OSGI-INF/,\
+               icons/
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java
index a648ecf..a619471 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElements.java
@@ -10,9 +10,12 @@
 
 import org.eclipse.xtext.Keyword;
 
-import com.google.inject.*;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 /**
+ * Common grammar elements composed of one or more keywords.
+ * 
  * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton
@@ -29,6 +32,10 @@
   private final String packed;
   private final String packedInBrackets;
 
+  /**
+   * Creates a new </code>{@link CompoundElements}</code>.
+   * @param keywords the keywords in our grammar.
+   */
   @Inject public CompoundElements(Keywords keywords) {
     inBracketsFormat = keywords.openingBracket().getValue() + "%s" + keywords.closingBracket().getValue();
     defaultValue = format("%s %s", keywords.defaultValue(), keywords.equalSign());
@@ -53,30 +60,58 @@
     return String.format(inBracketsFormat, element);
   }
 
+  /**
+   * Returns 'default ='.
+   * @return 'default ='.
+   */
   public String defaultValue() {
     return defaultValue;
   }
 
+  /**
+   * Returns '[default =]'.
+   * @return '[default =]'.
+   */
   public String defaultValueInBrackets() {
     return defaultValueInBrackets;
   }
 
+  /**
+   * Returns 'default = ""'.
+   * @return 'default = ""'.
+   */
   public String defaultStringValue() {
     return defaultStringValue;
   }
 
+  /**
+   * Returns '[default = ""]'.
+   * @return '[default = ""]'.
+   */
   public String defaultStringValueInBrackets() {
     return defaultStringValueInBrackets;
   }
 
+  /**
+   * Returns '""'.
+   * @return '""'.
+   */
   public String emptyString() {
     return EMPTY_STRING;
   }
 
+  /**
+   * Returns 'packed = true'.
+   * @return 'packed = true'.
+   */
   public String packed() {
     return packed;
   }
 
+  /**
+   * Returns '[packed = true]'.
+   * @return '[packed = true]'.
+   */
   public String packedInBrackets() {
     return packedInBrackets;
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java
index da6154f..a8695c2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/Keywords.java
@@ -19,6 +19,8 @@
 import com.google.inject.Singleton;
 
 /**
+ * Common keywords used in the code base.
+ * 
  * @author alruiz@google.com (Alex Ruiz)
  */
 @Singleton
@@ -36,6 +38,10 @@
   private Keyword semicolon;
   private Keyword string;
 
+  /**
+   * Creates a new </code>{@link Keywords}</code>.
+   * @param grammarAccess contains the grammar whose keywords we'll be extracting.
+   */
   @Inject public Keywords(IGrammarAccess grammarAccess) {
     List<Keyword> allKeywords = containedKeywords(grammarAccess.getGrammar());
     for (Keyword k : allKeywords) {
@@ -123,46 +129,90 @@
     return expectedValue.equals(k.getValue());
   }
 
+  /**
+   * Returns the representation of the keyword "bool".
+   * @return the representation of the keyword "bool".
+   */
   public Keyword bool() {
     return bool;
   }
 
+  /**
+   * Returns the representation of the keyword "true".
+   * @return the representation of the keyword "true".
+   */
   public Keyword boolTrue() {
     return boolTrue;
   }
 
+  /**
+   * Returns the representation of the keyword "false".
+   * @return the representation of the keyword "false".
+   */
   public Keyword boolFalse() {
     return boolFalse;
   }
 
+  /**
+   * Returns the representation of the keyword "bytes".
+   * @return the representation of the keyword "bytes".
+   */
   public Keyword bytes() {
     return bytes;
   }
 
+  /**
+   * Returns the representation of the keyword "[".
+   * @return the representation of the keyword "[".
+   */
   public Keyword openingBracket() {
     return openingBracket;
   }
 
+  /**
+   * Returns the representation of the keyword "]".
+   * @return the representation of the keyword "]".
+   */
   public Keyword closingBracket() {
     return closingBracket;
   }
 
+  /**
+   * Returns the representation of the keyword "default".
+   * @return the representation of the keyword "default".
+   */
   public Keyword defaultValue() {
     return defaultValue;
   }
 
+  /**
+   * Returns the representation of the keyword "=".
+   * @return the representation of the keyword "=".
+   */
   public Keyword equalSign() {
     return equalSign;
   }
 
+  /**
+   * Returns the representation of the keyword "packed".
+   * @return the representation of the keyword "packed".
+   */
   public Keyword packed() {
     return packed;
   }
 
+  /**
+   * Returns the representation of the keyword ";".
+   * @return the representation of the keyword ";".
+   */
   public Keyword semicolon() {
     return semicolon;
   }
 
+  /**
+   * Returns the representation of the keyword "string".
+   * @return the representation of the keyword "string".
+   */
   public Keyword string() {
     return string;
   }