00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <gtest/gtest.h>
00031
00032 #include <QApplication>
00033
00034 #include <ros/ros.h>
00035
00036 #include <sstream>
00037
00038 #include <rviz/properties/vector_property.h>
00039 #include <rviz/properties/color_property.h>
00040 #include <rviz/display_group.h>
00041 #include <rviz/config.h>
00042 #include <rviz/yaml_config_reader.h>
00043 #include <rviz/yaml_config_writer.h>
00044
00045 #include "mock_display.h"
00046 #include "mock_context.h"
00047
00048 using namespace rviz;
00049
00050 TEST( Display, load_properties )
00051 {
00052 std::stringstream input( "Name: sample\n"
00053 "Enabled: true\n"
00054 "Count: 7\n"
00055 "Pi: 3.2\n"
00056 "Offset: {X: -1, Y: 1.1, Z: 1.1e3}\n"
00057 "Color: white\n"
00058 "Style: loosey goosey\n" );
00059
00060 rviz::YamlConfigReader reader;
00061 rviz::Config config;
00062 reader.readStream(config, input);
00063
00064 MockDisplay d;
00065 d.load( config );
00066
00067 EXPECT_EQ( 7, d.count_->getValue().toInt() );
00068 EXPECT_EQ( "loosey goosey", d.style_->getValue().toString().toStdString() );
00069 EXPECT_EQ( 3.2f, d.pi_->getValue().toFloat() );
00070 Ogre::Vector3 offset = d.offset_->getVector();
00071 EXPECT_EQ( -1.f, offset.x );
00072 EXPECT_EQ( 1.1f, offset.y );
00073 EXPECT_EQ( 1100.f, offset.z );
00074 EXPECT_EQ( "255; 255; 255", d.color_->getValue().toString().toStdString() );
00075 EXPECT_EQ( true, d.getValue().toBool() );
00076 }
00077
00078 TEST( DisplayGroup, load_properties )
00079 {
00080 std::stringstream input(
00081 "Name: root\n"
00082 "Enabled: true\n"
00083 "Displays:\n"
00084 " -\n"
00085 " Class: MockDisplay\n"
00086 " Name: Steven\n"
00087 " Enabled: false\n"
00088 " Count: 17\n"
00089 " -\n"
00090 " Name: sub group\n"
00091 " Class: DisplayGroup\n"
00092 " Enabled: true\n"
00093 " Displays:\n"
00094 " -\n"
00095 " Class: MockDisplay\n"
00096 " Name: Curly\n"
00097 " Enabled: false\n"
00098 " Count: 900\n"
00099 " -\n"
00100 " Class: BrokenDisplay\n"
00101 " Name: Joe\n"
00102 " Enabled: true\n"
00103 " Count: 33\n"
00104 );
00105
00106 rviz::YamlConfigReader reader;
00107 rviz::Config config;
00108 reader.readStream(config, input);
00109
00110 DisplayGroup g;
00111 g.load( config );
00112
00113 EXPECT_EQ( true, g.getValue().toBool() );
00114 EXPECT_EQ( false, g.subProp("Steven")->getValue().toBool() );
00115 EXPECT_EQ( 17, g.subProp("Steven")->subProp("Count")->getValue().toInt() );
00116 EXPECT_EQ( 900, g.subProp("sub group")->subProp("Curly")->subProp("Count")->getValue().toInt() );
00117 EXPECT_EQ( "The class required for this display, 'BrokenDisplay', could not be loaded.",
00118 g.subProp("Joe")->getDescription().left( 74 ).toStdString());
00119 }
00120
00121 TEST( Display, save_properties)
00122 {
00123 MockDisplay d;
00124 d.setName( "Steven" );
00125 d.subProp( "Count" )->setValue( 37 );
00126
00127 rviz::YamlConfigWriter writer;
00128 rviz::Config config;
00129 d.save( config );
00130 QString out = writer.writeString(config);
00131
00132
00133
00134 EXPECT_EQ( std::string(
00135 "Class: \"\"\n"
00136 "Name: Steven\n"
00137 "Enabled: false\n"
00138 "Count: 37\n"
00139 "Style: chunky\n"
00140 "Pi: 3.14159\n"
00141 "Offset: {X: 1, Y: 2, Z: 3}\n"
00142 "Color: 10; 20; 30"
00143 )
00144 , out.toStdString().c_str() );
00145 }
00146
00147 TEST( DisplayGroup, save_properties)
00148 {
00149 DisplayGroup g;
00150 g.setName( "Charles" );
00151
00152 MockDisplay *d = new MockDisplay;
00153 d->setName( "Steven" );
00154 d->subProp( "Count" )->setValue( 101 );
00155 g.addChild( d );
00156
00157 d = new MockDisplay;
00158 d->setName( "Katherine" );
00159 d->subProp( "Pi" )->setValue( 1.1 );
00160 g.addChild( d );
00161
00162 rviz::YamlConfigWriter writer;
00163 rviz::Config config;
00164 g.save( config );
00165 QString out = writer.writeString(config);
00166
00167
00168
00169 EXPECT_EQ( std::string(
00170 "Class: \"\"\n"
00171 "Name: Charles\n"
00172 "Enabled: false\n"
00173 "Displays:\n"
00174 " - Class: \"\"\n"
00175 " Name: Steven\n"
00176 " Enabled: false\n"
00177 " Count: 101\n"
00178 " Style: chunky\n"
00179 " Pi: 3.14159\n"
00180 " Offset: {X: 1, Y: 2, Z: 3}\n"
00181 " Color: 10; 20; 30\n"
00182 " - Class: \"\"\n"
00183 " Name: Katherine\n"
00184 " Enabled: false\n"
00185 " Count: 10\n"
00186 " Style: chunky\n"
00187 " Pi: 1.1\n"
00188 " Offset: {X: 1, Y: 2, Z: 3}\n"
00189 " Color: 10; 20; 30"
00190 )
00191 , out.toStdString().c_str() );
00192 }
00193
00194 TEST( DisplayFactory, class_name )
00195 {
00196 std::stringstream input(
00197 "Displays:\n"
00198 " -\n"
00199 " Class: MockDisplay\n"
00200 );
00201
00202 rviz::YamlConfigReader reader;
00203 rviz::Config config;
00204 reader.readStream(config, input);
00205
00206 DisplayGroup g;
00207 g.load( config );
00208
00209 EXPECT_EQ( 1, g.numChildren() );
00210 EXPECT_EQ( "MockDisplay", g.getDisplayAt( 0 )->getClassId().toStdString() );
00211 }
00212
00213 TEST( DisplayFactory, failed_display )
00214 {
00215 std::stringstream input(
00216 "Displays:\n"
00217 " - Class: MissingDisplay\n"
00218 " Name: Chubbers\n"
00219 " NumLemurs: 77\n"
00220 " LemurStyle: chunky\n"
00221 " SubYaml:\n"
00222 " - 1\n"
00223 " - foo: bar\n"
00224 " food: bard\n"
00225 );
00226
00227 rviz::YamlConfigReader reader;
00228 rviz::Config config;
00229 reader.readStream(config, input);
00230
00231 DisplayGroup g;
00232 g.load( config );
00233
00234 EXPECT_EQ( 1, g.numChildren() );
00235 EXPECT_EQ( "MissingDisplay", g.getDisplayAt( 0 )->getClassId().toStdString() );
00236 EXPECT_EQ( 0, g.getDisplayAt( 0 )->numChildren() );
00237
00238
00239
00240 rviz::YamlConfigWriter writer;
00241 rviz::Config config2;
00242 g.save( config2 );
00243 QString out = writer.writeString(config);
00244 EXPECT_EQ( std::string(
00245 "Class: \"\"\n"
00246 "Name: \"\"\n"
00247 "Enabled: false\n"
00248 "Displays:\n"
00249 " - Class: MissingDisplay\n"
00250 " LemurStyle: chunky\n"
00251 " Name: Chubbers\n"
00252 " NumLemurs: 77\n"
00253 " SubYaml:\n"
00254 " - 1\n"
00255 " - foo: bar\n"
00256 " food: bard"
00257 )
00258 , out.toStdString().c_str() );
00259 }
00260
00261 int main( int argc, char **argv ) {
00262 ros::init( argc, argv, "display_test", ros::init_options::AnonymousName );
00263 QApplication app(argc, argv);
00264 testing::InitGoogleTest( &argc, argv );
00265 return RUN_ALL_TESTS();
00266 }