Home | History | Annotate | Download | only in testing
      1 // Copyright 2017 The Bazel Authors. All rights reserved.
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //    http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 package com.google.devtools.common.options.testing;
     16 
     17 import com.google.common.collect.ForwardingMap;
     18 import com.google.common.collect.ImmutableMap;
     19 import com.google.devtools.common.options.Converter;
     20 import java.util.Map;
     21 
     22 /**
     23  * An immutable mapping from {@link Converter} classes to {@link ConverterTester}s which test them.
     24  *
     25  * <p>Note that the ConverterTesters within are NOT immutable.
     26  */
     27 public final class ConverterTesterMap
     28     extends ForwardingMap<Class<? extends Converter<?>>, ConverterTester> {
     29 
     30   private final ImmutableMap<Class<? extends Converter<?>>, ConverterTester> delegate;
     31 
     32   private ConverterTesterMap(
     33       ImmutableMap<Class<? extends Converter<?>>, ConverterTester> delegate) {
     34     this.delegate = delegate;
     35   }
     36 
     37   @Override
     38   protected Map<Class<? extends Converter<?>>, ConverterTester> delegate() {
     39     return delegate;
     40   }
     41 
     42   /** A builder to construct new {@link ConverterTesterMap}s. */
     43   public static final class Builder {
     44     private final ImmutableMap.Builder<Class<? extends Converter<?>>, ConverterTester> delegate;
     45 
     46     public Builder() {
     47       this.delegate = ImmutableMap.builder();
     48     }
     49 
     50     /**
     51      * Adds a new ConverterTester, mapping it to the class of converter it tests. Only one tester
     52      * for each class is permitted; duplicates will cause {@link #build} to fail.
     53      */
     54     public Builder add(ConverterTester item) {
     55       delegate.put(item.getConverterClass(), item);
     56       return this;
     57     }
     58 
     59     /**
     60      * Adds the entries from the given {@link ConverterTesterMap}. Only one tester for each class is
     61      * permitted; duplicates will cause {@link #build} to fail.
     62      */
     63     public Builder addAll(ConverterTesterMap map) {
     64       // this is safe because we know the other map was constructed the same way this one was
     65       delegate.putAll(map);
     66       return this;
     67     }
     68 
     69     /**
     70      * Adds all of the ConverterTesters from the given iterable. Only one tester for each class is
     71      * permitted; duplicates will cause {@link #build} to fail.
     72      */
     73     public Builder addAll(Iterable<ConverterTester> items) {
     74       items.forEach(this::add);
     75       return this;
     76     }
     77 
     78     public ConverterTesterMap build() {
     79       return new ConverterTesterMap(delegate.build());
     80     }
     81   }
     82 }
     83