// Licensed to the Apache Software Foundation (ASF) under one or more contributor
// license agreements.  See the NOTICE.txt 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.oodt.cas.crawl.option;

//Junit imports
import junit.framework.TestCase;

//OODT imports
import org.apache.oodt.cas.crawl.MetExtractorProductCrawler;
import org.apache.oodt.cas.crawl.ProductCrawler; // for javadoc

/**
 * @author mattmann
 * @version $Revision$
 * @since OODT-241
 * 
 * <p>
 * Class ensures that boolean options such as --noRecur and --crawlForDirs are
 * settable in {@link ProductCrawler} derivatives
 * </p>.
 */
public final class TestBooleanOptions extends TestCase {

    public void testSetBooleanOptions() {
        MetExtractorProductCrawler crawler = new MetExtractorProductCrawler();
        try {
            crawler.getClass().getMethod("setNoRecur",
                    new Class[] { boolean.class }).invoke(crawler,
                    new Object[] { true });
        } catch (Exception e) {
            fail(e.getMessage());
        }

        try {
            crawler.getClass().getMethod("setCrawlForDirs",
                    new Class[] { boolean.class }).invoke(crawler,
                    new Object[] { true });
        } catch (Exception e) {
            fail(e.getMessage());
        }

        assertTrue(crawler.isNoRecur());
        assertTrue(crawler.isCrawlForDirs());

    }

}
