001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.commons.math.stat.data; 019 020 import java.io.BufferedReader; 021 import java.io.IOException; 022 import java.io.InputStreamReader; 023 import java.lang.reflect.InvocationTargetException; 024 import java.lang.reflect.Method; 025 import java.net.URL; 026 import java.util.HashMap; 027 import java.util.Map; 028 029 import junit.framework.TestCase; 030 031 import org.apache.commons.math.TestUtils; 032 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics; 033 import org.apache.commons.math.stat.descriptive.SummaryStatistics; 034 035 /** 036 * @version $Revision: 762118 $ $Date: 2009-04-05 12:55:59 -0400 (Sun, 05 Apr 2009) $ 037 */ 038 public abstract class CertifiedDataAbstractTest extends TestCase { 039 040 private DescriptiveStatistics descriptives; 041 042 private SummaryStatistics summaries; 043 044 private Map<String, Double> certifiedValues; 045 046 @Override 047 protected void setUp() throws Exception { 048 descriptives = new DescriptiveStatistics(); 049 summaries = new SummaryStatistics(); 050 certifiedValues = new HashMap<String, Double>(); 051 052 loadData(); 053 } 054 055 private void loadData() throws IOException { 056 BufferedReader in = null; 057 058 try { 059 URL resourceURL = getClass().getClassLoader().getResource(getResourceName()); 060 in = new BufferedReader(new InputStreamReader(resourceURL.openStream())); 061 062 String line = in.readLine(); 063 while (line != null) { 064 065 /* this call to StringUtils did little for the 066 * following conditional structure 067 */ 068 line = line.trim(); 069 070 // not empty line or comment 071 if (!("".equals(line) || line.startsWith("#"))) { 072 int n = line.indexOf('='); 073 if (n == -1) { 074 // data value 075 double value = Double.parseDouble(line); 076 descriptives.addValue(value); 077 summaries.addValue(value); 078 } else { 079 // certified value 080 String name = line.substring(0, n).trim(); 081 String valueString = line.substring(n + 1).trim(); 082 Double value = Double.valueOf(valueString); 083 certifiedValues.put(name, value); 084 } 085 } 086 line = in.readLine(); 087 } 088 } finally { 089 if (in != null) { 090 in.close(); 091 } 092 } 093 } 094 095 protected abstract String getResourceName(); 096 097 protected double getMaximumAbsoluteError() { 098 return 1.0e-5; 099 } 100 101 @Override 102 protected void tearDown() throws Exception { 103 descriptives.clear(); 104 descriptives = null; 105 106 summaries.clear(); 107 summaries = null; 108 109 certifiedValues.clear(); 110 certifiedValues = null; 111 } 112 113 public void testCertifiedValues() { 114 for (String name : certifiedValues.keySet()) { 115 Double expectedValue = certifiedValues.get(name); 116 117 Double summariesValue = getProperty(summaries, name); 118 if (summariesValue != null) { 119 TestUtils.assertEquals("summary value for " + name + " is incorrect.", 120 summariesValue.doubleValue(), expectedValue.doubleValue(), 121 getMaximumAbsoluteError()); 122 } 123 124 Double descriptivesValue = getProperty(descriptives, name); 125 if (descriptivesValue != null) { 126 TestUtils.assertEquals("descriptive value for " + name + " is incorrect.", 127 descriptivesValue.doubleValue(), expectedValue.doubleValue(), 128 getMaximumAbsoluteError()); 129 } 130 } 131 } 132 133 134 protected Double getProperty(Object bean, String name) { 135 try { 136 // Get the value of prop 137 String prop = "get" + name.substring(0,1).toUpperCase() + name.substring(1); 138 Method meth = bean.getClass().getMethod(prop, new Class[0]); 139 Object property = meth.invoke(bean, new Object[0]); 140 if (meth.getReturnType().equals(Double.TYPE)) { 141 return (Double) property; 142 } else if (meth.getReturnType().equals(Long.TYPE)) { 143 return Double.valueOf(((Long) property).doubleValue()); 144 } else { 145 fail("wrong type: " + meth.getReturnType().getName()); 146 } 147 } catch (NoSuchMethodException nsme) { 148 // ignored 149 } catch (InvocationTargetException ite) { 150 fail(ite.getMessage()); 151 } catch (IllegalAccessException iae) { 152 fail(iae.getMessage()); 153 } 154 return null; 155 } 156 }