/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.core.ext;

import com.google.gwt.core.ext.linker.Shardable;

import junit.framework.TestCase;

/**
 * Unit tests for the {@link Linker} class itself.
 */
public class LinkerUnitTest extends TestCase {
  public void testIsShardable() {
    {
      // Non-shardable by default
      class TestLinker extends Linker {
        @Override
        public String getDescription() {
          return "Test Linker";
        }
      }
      assertFalse(new TestLinker().isShardable());
    }

    {
      // Annotating as shardable
      @Shardable
      class TestLinker extends Linker {
        @Override
        public String getDescription() {
          return "Test Linker";
        }
      }
      assertTrue(new TestLinker().isShardable());
    }

    {
      // Using a private field to indicate shardability
      class TestLinker extends Linker {
        private boolean gwtIsShardable;

        @Override
        public String getDescription() {
          return "Test Linker";
        }
      }
      assertTrue(new TestLinker().isShardable());
    }
  }
}
