/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 org.apache.pig.test;

import java.io.IOException;

import org.junit.Assert;

import org.apache.pig.builtin.REPLACE;
import org.apache.pig.builtin.TOMAP;
import org.apache.pig.impl.PigContext;
import org.junit.Test;

public class TestPigContextClassCache {
    @Test
    public void testClassCache() throws IOException {
        Class<?> c = PigContext.resolveClassName("TOMAP");
        Assert.assertEquals(TOMAP.class, c);
        
        c = PigContext.resolveClassName("TOMAP");
        Assert.assertEquals(TOMAP.class, c);
        
        c = PigContext.resolveClassName("org.apache.pig.builtin.REPLACE");
        Assert.assertEquals(REPLACE.class, c);
    }
    
}
