Adding unit tests. Cleaning up code. Adding/updating Javadocs.
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/EnumHasLiterals.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/EnumHasLiterals.java
new file mode 100644
index 0000000..df5a346
--- /dev/null
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/EnumHasLiterals.java
@@ -0,0 +1,53 @@
+/*
+ * 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 java.util.*;
+
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.eclipse.protobuf.protobuf.Literal;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class EnumHasLiterals extends BaseMatcher<Enum> {
+
+  private final String[] literalNames;
+
+  public static EnumHasLiterals hasLiterals(String... literalNames) {
+    return new EnumHasLiterals(literalNames);
+  }
+  
+  private EnumHasLiterals(String... literalNames) {
+    this.literalNames = literalNames;
+  }
+  
+  /** {@inheritDoc} */
+  public boolean matches(Object arg) {
+    if (!(arg instanceof Enum)) return false;
+    Enum anEnum = (Enum) arg;
+    List<String> actualNames = literalNames(anEnum);
+    for (String name : literalNames) actualNames.remove(name);
+    return actualNames.isEmpty();
+  }
+
+  private List<String> literalNames(Enum anEnum) {
+    List<String> names = new ArrayList<String>();
+    for (Literal literal : anEnum.getLiterals()) names.add(literal.getName());
+    return names;
+  }
+  
+  /** {@inheritDoc} */
+  public void describeTo(Description description) {
+    description.appendValue(Arrays.toString(literalNames));
+  }
+}
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/Finder.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/Finder.java
index 50fddba..9f0affd 100644
--- a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/Finder.java
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/Finder.java
@@ -24,7 +24,13 @@
       if (name.equals(message.getName())) return message;
     return null;
   }
-  
+
+  public static Option findOption(String name, Protobuf root) {
+    for (Option option : root.getOptions())
+      if (name.equals(option.getName())) return option;
+    return null;
+  }
+
   public static Property findProperty(String name, Protobuf root) {
     for (Property property : allProperties(root))
       if (name.equals(property.getName())) return property;
diff --git a/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/PropertyHasType.java b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/PropertyHasType.java
new file mode 100644
index 0000000..9f53cba
--- /dev/null
+++ b/com.google.eclipse.protobuf.junit/src/com/google/eclipse/protobuf/junit/PropertyHasType.java
@@ -0,0 +1,52 @@
+/*
+ * 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.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PropertyHasType extends BaseMatcher<Property> {
+
+  private final String typeName;
+
+  public static PropertyHasType hasType(String typeName) {
+    return new PropertyHasType(typeName);
+  }
+  
+  private PropertyHasType(String typeName) {
+    this.typeName = typeName;
+  }
+  
+  /** {@inheritDoc} */
+  public boolean matches(Object arg) {
+    if (!(arg instanceof Property)) return false;
+    Property property = (Property) arg;
+    return typeName.equals(typeNameOf(property));
+  }
+  
+  private String typeNameOf(Property property) {
+    AbstractTypeReference r = property.getType();
+    if (r instanceof ScalarTypeReference) return ((ScalarTypeReference) r).getScalar().getName();
+    if (r instanceof TypeReference) {
+      Type type = ((TypeReference) r).getType();
+      return type == null ? null : type.getName();
+    }
+    return r.toString();
+  }
+
+  /** {@inheritDoc} */
+  public void describeTo(Description description) {
+    description.appendValue(typeName);
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider_getFullyQualifiedName_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider_getFullyQualifiedName_Test.java
index facba74..0307b19 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider_getFullyQualifiedName_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider_getFullyQualifiedName_Test.java
@@ -60,7 +60,6 @@
     assertThat(fqn.toString(), equalTo("fqn.test.Person.name"));
   }
 
-  
   @Test public void should_not_include_package_name_as_part_of_message_FQN_if_package_is_not_specified() {
     StringBuilder proto = new StringBuilder();
     proto.append("message Person {           ")
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/GlobalsTest_fileOptions_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/GlobalsTest_fileOptions_Test.java
new file mode 100644
index 0000000..ec8acab
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/GlobalsTest_fileOptions_Test.java
@@ -0,0 +1,55 @@
+/*
+ * 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.scoping;
+
+import static com.google.eclipse.protobuf.junit.PropertyHasType.hasType;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.*;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Property;
+
+/**
+ * Tests for <code>{@link Globals#fileOptions()}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class GlobalsTest_fileOptions_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  
+  private Globals globals;
+  
+  @Before public void setUp() {
+    globals = xtext.getInstanceOf(Globals.class);
+  }
+  
+  @Test public void should_return_all_file_options() {
+    Map<String, Property> fileOptions = mapByName(globals.fileOptions());
+    assertThat(fileOptions.get("java_package"), hasType("string"));   
+    assertThat(fileOptions.get("java_outer_classname"), hasType("string"));
+    assertThat(fileOptions.get("java_multiple_files"), hasType("bool"));
+    assertThat(fileOptions.get("java_generate_equals_and_hash"), hasType("bool"));
+    assertThat(fileOptions.containsKey("optimize_for"), equalTo(true));
+    assertThat(fileOptions.get("cc_generic_services"), hasType("bool"));
+    assertThat(fileOptions.get("java_generic_services"), hasType("bool"));
+    assertThat(fileOptions.get("py_generic_services"), hasType("bool"));
+  }
+
+  private static Map<String, Property> mapByName(Collection<Property> properties) {
+    Map<String, Property> mapByName = new HashMap<String, Property>();
+    for (Property property : properties)
+      mapByName.put(property.getName(), property);
+    return mapByName;
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_isOptimizeForOption_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_isOptimizeForOption_Test.java
new file mode 100644
index 0000000..fef5cb3
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_isOptimizeForOption_Test.java
@@ -0,0 +1,57 @@
+/*
+ * 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.scoping;
+
+import static com.google.eclipse.protobuf.junit.Finder.findOption;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Option;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+
+/**
+ * Tests for <code>{@link Globals#isOptimizeForOption(Option)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Globals_isOptimizeForOption_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  
+  private Globals globals;
+  
+  @Before public void setUp() {
+    globals = xtext.getInstanceOf(Globals.class);
+  }
+  
+  @Test public void should_true_if_option_is_OptimizeForOption() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("option java_generate_equals_and_hash = false;")
+         .append("option optimize_for = CODE_SIZE;             "); 
+    Protobuf root = xtext.parse(proto);
+    Option option = findOption("optimize_for", root);
+    assertThat(globals.isOptimizeForOption(option), equalTo(true));
+  }
+
+  @Test public void should_false_if_option_is_not_OptimizeForOption() {
+    StringBuilder proto = new StringBuilder();
+    proto.append("option java_generate_equals_and_hash = false;")
+         .append("option optimize_for = CODE_SIZE;             "); 
+    Protobuf root = xtext.parse(proto);
+    Option option = findOption("java_generate_equals_and_hash", root);
+    assertThat(globals.isOptimizeForOption(option), equalTo(false));
+  }
+
+  @Test public void should_false_if_option_is_null() {
+    assertThat(globals.isOptimizeForOption(null), equalTo(false));
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_lookupFileOption_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_lookupFileOption_Test.java
new file mode 100644
index 0000000..8923010
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_lookupFileOption_Test.java
@@ -0,0 +1,43 @@
+/*
+ * 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.scoping;
+
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Property;
+
+/**
+ * Tests for <code>{@link Globals#lookupFileOption(String)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Globals_lookupFileOption_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  
+  private Globals globals;
+  
+  @Before public void setUp() {
+    globals = xtext.getInstanceOf(Globals.class);
+  }
+
+  @Test public void should_look_up_file_option() {
+    Property option = globals.lookupFileOption("java_multiple_files");
+    assertThat(option.getName(), equalTo("java_multiple_files"));
+  }
+  
+  @Test public void should_return_null_if_option_not_found() {
+    assertThat(globals.lookupFileOption("hello"), nullValue());
+  }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_optimizedMode_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_optimizedMode_Test.java
new file mode 100644
index 0000000..8f1ad9b
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Globals_optimizedMode_Test.java
@@ -0,0 +1,40 @@
+/*
+ * 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.scoping;
+
+import static com.google.eclipse.protobuf.junit.EnumHasLiterals.hasLiterals;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Enum;
+
+/**
+ * Tests for <code>{@link Globals#optimizedMode()}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Globals_optimizedMode_Test {
+
+  @Rule public XtextRule xtext = new XtextRule();
+  
+  private Globals globals;
+  
+  @Before public void setUp() {
+    globals = xtext.getInstanceOf(Globals.class);
+  }
+  
+  @Test public void should_return_enum_OptimizeMode() {
+    Enum optimizedMode = globals.optimizedMode();
+    assertThat(optimizedMode.getName(), equalTo("OptimizeMode"));
+    assertThat(optimizedMode, hasLiterals("SPEED", "CODE_SIZE", "LITE_RUNTIME"));
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Globals.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Globals.java
index 9e1030c..e8e8b26 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Globals.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/Globals.java
@@ -22,7 +22,6 @@
 
 import com.google.eclipse.protobuf.protobuf.*;
 import com.google.eclipse.protobuf.protobuf.Enum;
-import com.google.eclipse.protobuf.util.EObjectFinder;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
@@ -36,18 +35,20 @@
 
   private Protobuf root;
 
-  private boolean initialized;
   private final Map<String, Property> fileOptions = new LinkedHashMap<String, Property>();
   private Enum optimizedMode;
 
-  @Inject EObjectFinder finder;
-
+  /**
+   * Creates a new </code>{@link Globals}</code>.
+   * @param parser the grammar parser.
+   */
   @Inject public Globals(IParser parser) {
     try {
       XtextResource resource = new XtextResource(createURI("globals.proto"));
       IParseResult result = parser.parse(new InputStreamReader(globalScopeContents(), "UTF-8"));
       root = (Protobuf) result.getRootASTElement();
       resource.getContents().add(root);
+      initContents();
     } catch (IOException e) {
       throw new IllegalStateException("Unable to parse global scope", e);
     }
@@ -79,9 +80,7 @@
     return proto.toString();
   }
 
-  private void init() {
-    if (initialized) return;
-    initialized = true;
+  private void initContents() {
     Message m = fileOptionsMessage();
     for (MessageElement e : m.getElements()) {
       if (e instanceof Property) {
@@ -105,23 +104,45 @@
     fileOptions.put(p.getName(), p);
   }
 
+  /**
+   * Returns all the file-level options available. These are the options defined in 
+   * {@code google/protobuf/descriptor.proto} (more details can be found
+   * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+   * @return all the file-level options available.
+   */
   public Collection<Property> fileOptions() {
-    init();
     return unmodifiableCollection(fileOptions.values());
   }
 
+  /**
+   * Returns the {@code enum} "OptimizeMode" (defined in {@code google/protobuf/descriptor.proto}. More details can be 
+   * found <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.) 
+   * @return the {@code enum} "OptimizeMode."
+   */
   public Enum optimizedMode() {
-    init();
     return optimizedMode;
   }
 
+  /**
+   * Indicates whether the given option is the "OptimizeMode" one (defined in {@code google/protobuf/descriptor.proto}. 
+   * More details can be found 
+   * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.) 
+   * @param option the given option.
+   * @return {@code true} if the given option is the "OptimizeMode" one, {@code false} otherwise.
+   */
   public boolean isOptimizeForOption(Option option) {
-    init();
+    if (option == null) return false;
     return "optimize_for".equals(option.getName());
   }
 
+  /**
+   * Looks up a file-level option per name. File-level options are defined in {@code google/protobuf/descriptor.proto}
+   * (more details can be found <a
+   * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+   * @param name the name of the option to look for.
+   * @return the option whose name matches the given one or {@code null} if a matching option is not found.
+   */
   public Property lookupFileOption(String name) {
-    init();
     return fileOptions.get(name);
   }
 }