/* * Copyright 2014 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.template.soy.sharedpasses.render; import com.google.common.annotations.VisibleForTesting; import com.google.template.soy.data.SoyRecord; import com.google.template.soy.data.SoyValue; import com.google.template.soy.data.SoyValueProvider; import com.google.template.soy.data.restricted.UndefinedData; import com.google.template.soy.exprtree.VarDefn; import com.google.template.soy.soytree.defn.LoopVar; import java.util.Map; /** An {@link Environment} for testing expressions. */ public final class TestingEnvironment extends Environment { /** * Creates an environment that should only be used in testing environments. Allows variables to be * resolved against a predefined set but doesn't allow binding new variable definitions. */ @VisibleForTesting public static Environment createForTest( final SoyRecord params, final Map<String, SoyValueProvider> locals) { return new TestingEnvironment(params, locals); } private final SoyRecord params; private final Map<String, SoyValueProvider> locals; private TestingEnvironment(SoyRecord params, Map<String, SoyValueProvider> locals) { this.params = params; this.locals = locals; } @Override void bind(VarDefn var, SoyValueProvider value) { throw new UnsupportedOperationException(); } @Override void bindIsLast(LoopVar loopVar, boolean isLast) { throw new UnsupportedOperationException(); } @Override void bindCurrentIndex(LoopVar loopVar, int lastIndex) { throw new UnsupportedOperationException(); } @Override SoyValue getVar(VarDefn var) { return getVarProvider(var).resolve(); } @Override boolean isLast(LoopVar loopVar) { return doGetProvider(loopVar.name() + "__isLast").resolve().booleanValue(); } @Override int getIndex(LoopVar loopVar) { return doGetProvider(loopVar.name() + "__index").resolve().integerValue(); } @Override SoyValueProvider getVarProvider(VarDefn var) { return doGetProvider(var.name()); } private SoyValueProvider doGetProvider(String name) { SoyValueProvider provider = locals.get(name); if (provider == null) { provider = params.getFieldProvider(name); if (provider == null) { provider = UndefinedData.INSTANCE; } } return provider; } }