/*
 * Copyright 2002-2009 the original author or authors.
 *
 * 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 net.sf.json;

import junit.framework.TestCase;

/**
 * @author Andres Almiray <aalmiray@users.sourceforge.net>
 */
public abstract class AbstractJSONObjectStaticBuildersTestCase extends TestCase {
   public AbstractJSONObjectStaticBuildersTestCase( String testName ) {
      super( testName );
   }

   public void testFromObject() {
      JSONObject json = JSONObject.fromObject( getSource() );
      assertJSONObject( json, getProperties() );
      assertTrue( !json.has( "class" ) );
   }

   public void testFromObject_excludes() {
      JsonConfig jsonConfig = new JsonConfig();
      jsonConfig.setExcludes( getExclusions() );
      JSONObject json = JSONObject.fromObject( getSource(), jsonConfig );
      assertJSONObject( json, getProperties() );
      String[] excluded = getExclusions();
      for( int i = 0; i < excluded.length; i++ ){
         assertTrue( !json.has( excluded[i] ) );
      }
      assertTrue( !json.has( "class" ) );
      assertTrue( !json.has( "pexcluded" ) );
   }

   public void testFromObject_excludes_ignoreDefaults() {
      JsonConfig jsonConfig = new JsonConfig();
      jsonConfig.setExcludes( getExclusions() );
      jsonConfig.setIgnoreDefaultExcludes( true );
      JSONObject json = JSONObject.fromObject( getSource(), jsonConfig );
      assertJSONObject( json, getProperties() );
      assertTrue( json.has( "class" ) );
      assertTrue( !json.has( "pexcluded" ) );
   }

   protected String[] getExclusions() {
      return new String[] { "pexcluded" };
   }

   protected String[] getProperties() {
      return PropertyConstants.getProperties();
   }

   protected abstract Object getSource();

   private void assertJSONObject( JSONObject json, String[] properties ) {
      assertNotNull( json );
      for( int i = 0; i < properties.length; i++ ){
         assertTrue( json.has( properties[i] ) );
      }
   }
}