test_chain.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2008, Willow Garage, Inc.
00003  * All rights reserved.
00004  * 
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  * 
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of the Willow Garage, Inc. nor the names of its
00014  *       contributors may be used to endorse or promote products derived from
00015  *       this software without specific prior written permission.
00016  * 
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 #include "gtest/gtest.h"
00031 #include "filters/filter_chain.h"
00032 
00033 
00034 
00035 TEST(MultiChannelFilterChain, configuring){
00036   double epsilon = 1e-9;
00037   filters::MultiChannelFilterChain<double> chain("double");
00038 
00039   EXPECT_TRUE(chain.configure(5, "MultiChannelMeanFilterDouble5"));
00040  
00041   double input1[] = {1,2,3,4,5};
00042   double input1a[] = {9,9,9,9,9};//seed w/incorrect values
00043   std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double));
00044   std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double));
00045 
00046   
00047   EXPECT_TRUE(chain.update(v1, v1a));
00048 
00049   chain.clear();
00050 
00051   for (unsigned int i = 1; i < v1.size(); i++)
00052   {
00053     EXPECT_NEAR(input1[i], v1a[i], epsilon);
00054   }
00055 }
00056 TEST(FilterChain, configuring){
00057   double epsilon = 1e-9;
00058   filters::FilterChain<float> chain("float");
00059   
00060   EXPECT_TRUE(chain.configure("MeanFilterFloat5"));
00061  
00062   float v1 = 1;
00063   float v1a = 9;
00064 
00065   EXPECT_TRUE(chain.update(v1, v1a));
00066 
00067   chain.clear();
00068 
00069   EXPECT_NEAR(v1, v1a, epsilon);
00070   
00071   }
00072 
00073 TEST(MultiChannelFilterChain, MisconfiguredNumberOfChannels){
00074   filters::MultiChannelFilterChain<double> chain("double");
00075 
00076   EXPECT_TRUE(chain.configure(10, "MultiChannelMedianFilterDouble5"));
00077 
00078   //  EXPECT_TRUE(chain.configure(10));
00079 
00080   double input1[] = {1,2,3,4,5};
00081   double input1a[] = {1,2,3,4,5};
00082   std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double));
00083   std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double));
00084 
00085   
00086   EXPECT_FALSE(chain.update(v1, v1a));
00087 
00088   chain.clear();
00089 
00090 }
00091 
00092 TEST(MultiChannelFilterChain, TwoFilters){
00093   double epsilon = 1e-9;
00094   filters::MultiChannelFilterChain<double> chain("double");
00095 
00096   EXPECT_TRUE(chain.configure(5, "TwoFilters"));
00097  
00098   double input1[] = {1,2,3,4,5};
00099   double input1a[] = {9,9,9,9,9};//seed w/incorrect values
00100   std::vector<double> v1 (input1, input1 + sizeof(input1) / sizeof(double));
00101   std::vector<double> v1a (input1a, input1a + sizeof(input1a) / sizeof(double));
00102 
00103   
00104   EXPECT_TRUE(chain.update(v1, v1a));
00105 
00106   chain.clear();
00107 
00108   for (unsigned int i = 1; i < v1.size(); i++)
00109   {
00110     EXPECT_NEAR(input1[i], v1a[i], epsilon);
00111   }
00112 }
00113 
00114 
00115 TEST(MultiChannelFilterChain, TransferFunction){
00116   double epsilon = 1e-4;
00117  
00118   filters::MultiChannelFilterChain<double> chain("double");
00119   EXPECT_TRUE(chain.configure(3, "TransferFunction" ));
00120  
00121   std::vector<double> in1,in2,in3,in4,in5,in6,in7;
00122   std::vector<double> out1;
00123 
00124   in1.push_back(10.0);
00125   in1.push_back(10.0);
00126   in1.push_back(10.0);
00127   //
00128   in2.push_back(70.0);
00129   in2.push_back(30.0);
00130   in2.push_back(8.0);
00131   //
00132   in3.push_back(-1.0);
00133   in3.push_back(5.0);
00134   in3.push_back(22.0);
00135   //
00136   in4.push_back(44.0);
00137   in4.push_back(23.0);
00138   in4.push_back(8.0);
00139   //
00140   in5.push_back(10.0);
00141   in5.push_back(10.0);
00142   in5.push_back(10.0);
00143   //
00144   in6.push_back(5.0);
00145   in6.push_back(-1.0);
00146   in6.push_back(5.0);
00147   //
00148   in7.push_back(6.0);
00149   in7.push_back(-30.0);
00150   in7.push_back(2.0);
00151   //
00152   out1.push_back(17.1112);
00153   out1.push_back(9.0285);
00154   out1.push_back(8.3102);
00155   EXPECT_TRUE(chain.update(in1, in1));
00156   EXPECT_TRUE(chain.update(in2, in2));
00157   EXPECT_TRUE(chain.update(in3, in3));
00158   EXPECT_TRUE(chain.update(in4, in4));
00159   EXPECT_TRUE(chain.update(in5, in5));
00160   EXPECT_TRUE(chain.update(in6, in6));
00161   EXPECT_TRUE(chain.update(in7, in7));
00162 
00163   chain.clear();
00164 
00165   for(unsigned int i=0; i<out1.size(); i++)
00166   {
00167     EXPECT_NEAR(out1[i], in7[i], epsilon);
00168   }
00169 }
00170 
00171 /*
00172 TEST(MultiChannelFilterChain, OverlappingNames){
00173   filters::MultiChannelFilterChain<double> chain("double");
00174 
00175 
00176   std::string bad_xml = "<filters> <filter type=\"MultiChannelMeanFilterDouble\" name=\"mean_test\"> <params number_of_observations=\"5\"/></filter><filter type=\"MedianFilter\" name=\"mean_test\"> <params number_of_observations=\"5\"/></filter></filters>";
00177 
00178   TiXmlDocument chain_def = TiXmlDocument();
00179   chain_def.Parse(bad_xml.c_str());
00180   TiXmlElement * config = chain_def.RootElement();
00181 
00182   EXPECT_FALSE(chain.configure(5, config));
00183 
00184 }
00185 */
00186 
00187 TEST(FilterChain, ReconfiguringChain){
00188   filters::FilterChain<int> chain("int");
00189   
00190   int v1 = 1;
00191   int v1a = 9;
00192 
00193   EXPECT_TRUE(chain.configure("OneIncrements")); 
00194   EXPECT_TRUE(chain.update(v1, v1a));
00195   EXPECT_EQ(2, v1a);
00196   chain.clear();
00197   
00198   EXPECT_TRUE(chain.configure("TwoIncrements")); 
00199   EXPECT_TRUE(chain.update(v1, v1a));
00200   EXPECT_EQ(3, v1a);
00201   chain.clear();
00202   
00203 }
00204 
00205 TEST(FilterChain, ThreeIncrementChains){
00206   filters::FilterChain<int> chain("int");  
00207   int v1 = 1;
00208   int v1a = 9;
00209 
00210   EXPECT_TRUE(chain.configure("ThreeIncrements")); 
00211   EXPECT_TRUE(chain.update(v1, v1a));
00212   EXPECT_EQ(4, v1a);
00213   chain.clear();
00214     
00215 }
00216 
00217 TEST(FilterChain, TenIncrementChains){
00218   filters::FilterChain<int> chain("int");  
00219   int v1 = 1;
00220   int v1a = 9;
00221 
00222   EXPECT_TRUE(chain.configure("TenIncrements")); 
00223   EXPECT_TRUE(chain.update(v1, v1a));
00224   EXPECT_EQ(11, v1a);
00225   chain.clear();
00226     
00227 }
00228 /*
00229 TEST(MultiChannelFilterChain, ReconfiguringMultiChannelChain){
00230   filters::MultiChannelFilterChain<int> chain("int");
00231   
00232   int v1 = 1;
00233   int v1a = 9;
00234 
00235   EXPECT_TRUE(chain.configure("OneMultiChannelIncrements")); 
00236   EXPECT_TRUE(chain.update(v1, v1a));
00237   EXPECT_EQ(2, v1a);
00238   chain.clear();
00239   
00240   EXPECT_TRUE(chain.configure("TwoMultiChannelIncrements")); 
00241   EXPECT_TRUE(chain.update(v1, v1a));
00242   EXPECT_EQ(3, v1a);
00243   chain.clear();
00244   
00245 }
00246 
00247 TEST(MultiChannelFilterChain, ThreeMultiChannelIncrementChains){
00248   filters::MultiChannelFilterChain<int> chain("int");  
00249   int v1 = 1;
00250   int v1a = 9;
00251 
00252   EXPECT_TRUE(chain.configure("ThreeMultiChannelIncrements")); 
00253   EXPECT_TRUE(chain.update(v1, v1a));
00254   EXPECT_EQ(4, v1a);
00255   chain.clear();
00256     
00257 }
00258 */
00259 TEST(MultiChannelFilterChain, TenMultiChannelIncrementChains){
00260   filters::MultiChannelFilterChain<int> chain("int");  
00261   std::vector<int> v1;
00262   v1.push_back(1);
00263   v1.push_back(1);
00264   v1.push_back(1);
00265   std::vector<int> v1a = v1;
00266 
00267   EXPECT_TRUE(chain.configure(3, "TenMultiChannelIncrements")); 
00268   EXPECT_TRUE(chain.update(v1, v1a));
00269   for (unsigned int i = 0; i < 3; i++)
00270   {
00271     EXPECT_EQ(11, v1a[i]);
00272   }
00273   chain.clear();
00274     
00275 }
00276 
00277 
00278 int main(int argc, char **argv){
00279   testing::InitGoogleTest(&argc, argv);
00280   ros::init(argc, argv, "test_chain");
00281   return RUN_ALL_TESTS();
00282 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Defines


filters
Author(s): Tully Foote/tfoote@willowgarage.com
autogenerated on Mon Aug 19 2013 11:35:05