annotate trunk/external/oscpack/tests/OscUnitTests.cpp @ 706:f8e90b5d85fd tip

Delete CARFAC code from this repository. It has been moved to https://github.com/google/carfac Please email me with your github username to get access. I've also created a new mailing list to discuss CARFAC development: https://groups.google.com/forum/#!forum/carfac-dev
author ronw@google.com
date Thu, 18 Jul 2013 20:56:51 +0000
parents 4b37b53105a3
children
rev   line source
tomwalters@570 1 /*
tomwalters@570 2 oscpack -- Open Sound Control packet manipulation library
tomwalters@570 3 http://www.audiomulch.com/~rossb/oscpack
tomwalters@570 4
tomwalters@570 5 Copyright (c) 2004-2005 Ross Bencina <rossb@audiomulch.com>
tomwalters@570 6
tomwalters@570 7 Permission is hereby granted, free of charge, to any person obtaining
tomwalters@570 8 a copy of this software and associated documentation files
tomwalters@570 9 (the "Software"), to deal in the Software without restriction,
tomwalters@570 10 including without limitation the rights to use, copy, modify, merge,
tomwalters@570 11 publish, distribute, sublicense, and/or sell copies of the Software,
tomwalters@570 12 and to permit persons to whom the Software is furnished to do so,
tomwalters@570 13 subject to the following conditions:
tomwalters@570 14
tomwalters@570 15 The above copyright notice and this permission notice shall be
tomwalters@570 16 included in all copies or substantial portions of the Software.
tomwalters@570 17
tomwalters@570 18 Any person wishing to distribute modifications to the Software is
tomwalters@570 19 requested to send the modifications to the original developer so that
tomwalters@570 20 they can be incorporated into the canonical version.
tomwalters@570 21
tomwalters@570 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
tomwalters@570 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
tomwalters@570 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
tomwalters@570 25 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
tomwalters@570 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
tomwalters@570 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
tomwalters@570 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
tomwalters@570 29 */
tomwalters@570 30 #include "OscUnitTests.h"
tomwalters@570 31
tomwalters@570 32 #include <iostream>
tomwalters@570 33 #include <iomanip>
tomwalters@570 34
tomwalters@570 35 #include "osc/OscReceivedElements.h"
tomwalters@570 36 #include "osc/OscPrintReceivedElements.h"
tomwalters@570 37 #include "osc/OscOutboundPacketStream.h"
tomwalters@570 38
tomwalters@570 39
tomwalters@570 40 namespace osc{
tomwalters@570 41
tomwalters@570 42 static int passCount_=0, failCount_=0;
tomwalters@570 43
tomwalters@570 44 void PrintTestSummary()
tomwalters@570 45 {
tomwalters@570 46 std::cout << (passCount_+failCount_) << " tests run, " << passCount_ << " passed, " << failCount_ << " failed.\n";
tomwalters@570 47 }
tomwalters@570 48
tomwalters@570 49 void pass_equality( const char *slhs, const char *srhs, const char *file, int line )
tomwalters@570 50 {
tomwalters@570 51 ++passCount_;
tomwalters@570 52 std::cout << file << "(" << line << "): PASSED : " << slhs << " == " << srhs << "\n";
tomwalters@570 53 }
tomwalters@570 54
tomwalters@570 55 void fail_equality( const char *slhs, const char *srhs, const char *file, int line )
tomwalters@570 56 {
tomwalters@570 57 ++failCount_;
tomwalters@570 58 std::cout << file << "(" << line << "): FAILED : " << slhs << " != " << srhs << "\n";
tomwalters@570 59 }
tomwalters@570 60
tomwalters@570 61 template <typename T>
tomwalters@570 62 void assertEqual_( const T& lhs, const T& rhs, const char *slhs, const char *srhs, const char *file, int line )
tomwalters@570 63 {
tomwalters@570 64 if( lhs == rhs )
tomwalters@570 65 pass_equality( slhs, srhs, file, line );
tomwalters@570 66 else
tomwalters@570 67 fail_equality( slhs, srhs, file, line );
tomwalters@570 68 }
tomwalters@570 69
tomwalters@570 70 template <typename T>
tomwalters@570 71 void assertEqual_( const T* lhs, const T* rhs, const char *slhs, const char *srhs, const char *file, int line )
tomwalters@570 72 {
tomwalters@570 73 if( lhs == rhs )
tomwalters@570 74 pass_equality( slhs, srhs, file, line );
tomwalters@570 75 else
tomwalters@570 76 fail_equality( slhs, srhs, file, line );
tomwalters@570 77 }
tomwalters@570 78
tomwalters@570 79 template <>
tomwalters@570 80 void assertEqual_( const char* lhs, const char* rhs, const char *slhs, const char *srhs, const char *file, int line )
tomwalters@570 81 {
tomwalters@570 82 if( strcmp( lhs, rhs ) == 0 )
tomwalters@570 83 pass_equality( slhs, srhs, file, line );
tomwalters@570 84 else
tomwalters@570 85 fail_equality( slhs, srhs, file, line );
tomwalters@570 86 }
tomwalters@570 87
tomwalters@570 88
tomwalters@570 89 #define assertEqual( a, b ) assertEqual_( (a), (b), #a, #b, __FILE__, __LINE__ )
tomwalters@570 90
tomwalters@570 91 //---------------------------------------------------------------------------
tomwalters@570 92 char * AllocateAligned4( unsigned long size )
tomwalters@570 93 {
tomwalters@570 94 char *s = new char[ size + 4 ]; //allocate on stack to get 4 byte alignment
tomwalters@570 95 return (char*)((long)(s-1) & (~0x03L)) + 4;
tomwalters@570 96 }
tomwalters@570 97
tomwalters@570 98 // allocate a 4 byte aligned copy of s
tomwalters@570 99 char * NewMessageBuffer( const char *s, unsigned long length )
tomwalters@570 100 {
tomwalters@570 101 char *p = AllocateAligned4( length );
tomwalters@570 102 memcpy( p, s, length );
tomwalters@570 103 return p;
tomwalters@570 104 }
tomwalters@570 105
tomwalters@570 106 void test1()
tomwalters@570 107 {
tomwalters@570 108 const char s[] = "/test\0\0\0,fiT\0\0\0\0\0\0\0\0\0\0\0A";
tomwalters@570 109 char *buffer = NewMessageBuffer( s, sizeof(s)-1 );
tomwalters@570 110
tomwalters@570 111 // test argument iterator interface
tomwalters@570 112 bool unexpectedExceptionCaught = false;
tomwalters@570 113 try{
tomwalters@570 114 ReceivedMessage m( ReceivedPacket(buffer, sizeof(s)-1) );
tomwalters@570 115
tomwalters@570 116 assertEqual( strcmp( m.AddressPattern(), "/test" ), 0 );
tomwalters@570 117 assertEqual( strcmp( m.TypeTags(), "fiT" ), 0 );
tomwalters@570 118
tomwalters@570 119 ReceivedMessage::const_iterator i = m.ArgumentsBegin();
tomwalters@570 120 ++i;
tomwalters@570 121 ++i;
tomwalters@570 122 ++i;
tomwalters@570 123 assertEqual( i, m.ArgumentsEnd() );
tomwalters@570 124
tomwalters@570 125 i = m.ArgumentsBegin();
tomwalters@570 126 float f = (i++)->AsFloat();
tomwalters@570 127 (void)f;
tomwalters@570 128 int n = (i++)->AsInt32();
tomwalters@570 129 (void)n;
tomwalters@570 130 bool b = (i++)->AsBool();
tomwalters@570 131 (void)b;
tomwalters@570 132
tomwalters@570 133 i = m.ArgumentsBegin();
tomwalters@570 134 bool exceptionThrown = false;
tomwalters@570 135 try{
tomwalters@570 136 int n = (i++)->AsInt32();
tomwalters@570 137 (void)n;
tomwalters@570 138 }catch( Exception& ){
tomwalters@570 139 exceptionThrown = true;
tomwalters@570 140 }
tomwalters@570 141 assertEqual( exceptionThrown, true );
tomwalters@570 142
tomwalters@570 143 }catch( Exception& e ){
tomwalters@570 144 std::cout << "unexpected exception: " << e.what() << "\n";
tomwalters@570 145 unexpectedExceptionCaught = true;
tomwalters@570 146 }
tomwalters@570 147 assertEqual( unexpectedExceptionCaught, false );
tomwalters@570 148
tomwalters@570 149
tomwalters@570 150 // test argument stream interface
tomwalters@570 151 unexpectedExceptionCaught = false;
tomwalters@570 152 try{
tomwalters@570 153 ReceivedMessage m( ReceivedPacket(buffer, sizeof(s)-1) );
tomwalters@570 154 ReceivedMessageArgumentStream args = m.ArgumentStream();
tomwalters@570 155 assertEqual( args.Eos(), false );
tomwalters@570 156
tomwalters@570 157 float f;
tomwalters@570 158 long n;
tomwalters@570 159 bool b;
tomwalters@570 160 args >> f >> n >> b;
tomwalters@570 161
tomwalters@570 162 (void) f;
tomwalters@570 163 (void) n;
tomwalters@570 164 (void) b;
tomwalters@570 165
tomwalters@570 166 assertEqual( args.Eos(), true );
tomwalters@570 167
tomwalters@570 168 }catch( Exception& e ){
tomwalters@570 169 std::cout << "unexpected exception: " << e.what() << "\n";
tomwalters@570 170 unexpectedExceptionCaught = true;
tomwalters@570 171 }
tomwalters@570 172 assertEqual( unexpectedExceptionCaught, false );
tomwalters@570 173 }
tomwalters@570 174
tomwalters@570 175 //---------------------------------------------------------------------------
tomwalters@570 176
tomwalters@570 177
tomwalters@570 178 #define TEST2_PRINT( ss )\
tomwalters@570 179 {\
tomwalters@570 180 const char s[] = ss;\
tomwalters@570 181 ReceivedPacket p( NewMessageBuffer( s, sizeof(s)-1 ), sizeof(s)-1 ); \
tomwalters@570 182 ReceivedMessage m( p );\
tomwalters@570 183 std::cout << m << "\n";\
tomwalters@570 184 }
tomwalters@570 185
tomwalters@570 186 void test2()
tomwalters@570 187 {
tomwalters@570 188 bool unexpectedExceptionCaught = false;
tomwalters@570 189 try{
tomwalters@570 190 // 012301230 1 2 3
tomwalters@570 191 TEST2_PRINT( "/no_args\0\0\0\0" );
tomwalters@570 192
tomwalters@570 193 // 012301230 1 2 3 01 2 3
tomwalters@570 194 TEST2_PRINT( "/no_args\0\0\0\0,\0\0\0" );
tomwalters@570 195
tomwalters@570 196 // 01230123 012 3 0 1 2 3
tomwalters@570 197 TEST2_PRINT( "/an_int\0,i\0\0\0\0\0A" );
tomwalters@570 198 // 012301230 1 2 3 012 3 0 1 2 3
tomwalters@570 199 TEST2_PRINT( "/a_float\0\0\0\0,f\0\0\0\0\0\0" );
tomwalters@570 200 // 0123012301 2 3 012 3 012301230123
tomwalters@570 201 TEST2_PRINT( "/a_string\0\0\0,s\0\0hello world\0" );
tomwalters@570 202 // 01230123 012 3 0 1 2 3 0 1 2 3
tomwalters@570 203 TEST2_PRINT( "/a_blob\0,b\0\0\0\0\0\x4\x0\x1\x2\x3" );
tomwalters@570 204
tomwalters@570 205 // 0123012301 2 3 012 3 0 1 2 3 0 1 2 3
tomwalters@570 206 TEST2_PRINT( "/an_int64\0\0\0,h\0\0\0\0\0\0\0\0\0\x1" );
tomwalters@570 207 // 01230123012 3 012 3 0 1 2 3 0 1 2 3
tomwalters@570 208 TEST2_PRINT( "/a_timetag\0\0,t\0\0\0\0\0\0\0\0\0\x1" );
tomwalters@570 209 // 0123012301 2 3 012 3 0 1 2 3 0 1 2 3
tomwalters@570 210 TEST2_PRINT( "/a_double\0\0\0,d\0\0\0\0\0\0\0\0\0\0" );
tomwalters@570 211 // 0123012301 2 3 012 3 012301230123
tomwalters@570 212 TEST2_PRINT( "/a_symbol\0\0\0,S\0\0hello world\0" );
tomwalters@570 213 // 01230123 012 3 0 1 2 3
tomwalters@570 214 TEST2_PRINT( "/a_char\0,c\0\0\0\0\0A" );
tomwalters@570 215 // 012301230 1 2 3 012 3 0 1 2 3
tomwalters@570 216 TEST2_PRINT( "/a_color\0\0\0\0,r\0\0\0\0\0\0" );
tomwalters@570 217 // 012301230123012 3 012 3 0 1 2 3
tomwalters@570 218 TEST2_PRINT( "/a_midimessage\0\0,m\0\0\0\0\0\0" );
tomwalters@570 219 // 01230123 012 3
tomwalters@570 220 TEST2_PRINT( "/a_bool\0,T\0\0" );
tomwalters@570 221 // 01230123 012 3
tomwalters@570 222 TEST2_PRINT( "/a_bool\0,F\0\0" );
tomwalters@570 223 // 01230 1 2 3 012 3
tomwalters@570 224 TEST2_PRINT( "/Nil\0\0\0\0,N\0\0" );
tomwalters@570 225 // 01230 1 2 3 012 3
tomwalters@570 226 TEST2_PRINT( "/Inf\0\0\0\0,I\0\0" );
tomwalters@570 227
tomwalters@570 228 TEST2_PRINT( "/test\0\0\0,fiT\0\0\0\0\0\0\0\0\0\0\0A" );
tomwalters@570 229
tomwalters@570 230 bool exceptionThrown = false;
tomwalters@570 231 try{
tomwalters@570 232 TEST2_PRINT( "/a_char\0,x\0\0\0\0\0A" ); // unknown type tag 'x'
tomwalters@570 233 }catch( Exception& ){
tomwalters@570 234 exceptionThrown = true;
tomwalters@570 235 }
tomwalters@570 236 assertEqual( exceptionThrown, true );
tomwalters@570 237
tomwalters@570 238 }catch( Exception& e ){
tomwalters@570 239 std::cout << "unexpected exception: " << e.what() << "\n";
tomwalters@570 240 unexpectedExceptionCaught = true;
tomwalters@570 241 }
tomwalters@570 242 assertEqual( unexpectedExceptionCaught, false );
tomwalters@570 243 }
tomwalters@570 244
tomwalters@570 245 //-----------------------------------------------------------------------
tomwalters@570 246
tomwalters@570 247 // pack a message and then unpack it and check that the result is the same
tomwalters@570 248 // also print each message
tomwalters@570 249 // repeat the process inside a bundle
tomwalters@570 250
tomwalters@570 251 #define TEST_PACK_UNPACK0( addressPattern, argument, value, recieveGetter ) \
tomwalters@570 252 { \
tomwalters@570 253 memset( buffer, 0x74, bufferSize ); \
tomwalters@570 254 OutboundPacketStream ps( buffer, bufferSize ); \
tomwalters@570 255 ps << BeginMessage( addressPattern ) \
tomwalters@570 256 << argument \
tomwalters@570 257 << EndMessage;\
tomwalters@570 258 assertEqual( ps.IsReady(), true );\
tomwalters@570 259 ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );\
tomwalters@570 260 std::cout << m << "\n";\
tomwalters@570 261 assertEqual( m.ArgumentsBegin()-> recieveGetter () , value );\
tomwalters@570 262 } \
tomwalters@570 263 { \
tomwalters@570 264 memset( buffer, 0x74, bufferSize ); \
tomwalters@570 265 OutboundPacketStream ps( buffer, bufferSize ); \
tomwalters@570 266 ps << BeginBundle( 1234 ) \
tomwalters@570 267 << BeginMessage( addressPattern ) \
tomwalters@570 268 << argument \
tomwalters@570 269 << EndMessage \
tomwalters@570 270 << EndBundle;\
tomwalters@570 271 assertEqual( ps.IsReady(), true );\
tomwalters@570 272 ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) );\
tomwalters@570 273 ReceivedMessage m( *b.ElementsBegin() );\
tomwalters@570 274 std::cout << m << "\n";\
tomwalters@570 275 assertEqual( m.ArgumentsBegin()-> recieveGetter () , value );\
tomwalters@570 276 }
tomwalters@570 277
tomwalters@570 278 #define TEST_PACK_UNPACK( addressPattern, argument, type, recieveGetter ) \
tomwalters@570 279 { \
tomwalters@570 280 memset( buffer, 0x74, bufferSize ); \
tomwalters@570 281 OutboundPacketStream ps( buffer, bufferSize ); \
tomwalters@570 282 ps << BeginMessage( addressPattern ) \
tomwalters@570 283 << argument \
tomwalters@570 284 << EndMessage;\
tomwalters@570 285 assertEqual( ps.IsReady(), true );\
tomwalters@570 286 ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );\
tomwalters@570 287 std::cout << m << "\n";\
tomwalters@570 288 assertEqual( m.ArgumentsBegin()-> recieveGetter () , ( type ) argument );\
tomwalters@570 289 } \
tomwalters@570 290 { \
tomwalters@570 291 memset( buffer, 0x74, bufferSize ); \
tomwalters@570 292 OutboundPacketStream ps( buffer, bufferSize ); \
tomwalters@570 293 ps << BeginBundle( 1234 ) \
tomwalters@570 294 << BeginMessage( addressPattern ) \
tomwalters@570 295 << argument \
tomwalters@570 296 << EndMessage \
tomwalters@570 297 << EndBundle;\
tomwalters@570 298 assertEqual( ps.IsReady(), true );\
tomwalters@570 299 ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) );\
tomwalters@570 300 ReceivedMessage m( *b.ElementsBegin() );\
tomwalters@570 301 std::cout << m << "\n";\
tomwalters@570 302 assertEqual( m.ArgumentsBegin()-> recieveGetter () , ( type ) argument );\
tomwalters@570 303 }
tomwalters@570 304
tomwalters@570 305 void test3()
tomwalters@570 306 {
tomwalters@570 307 int bufferSize = 1000;
tomwalters@570 308 char *buffer = AllocateAligned4( bufferSize );
tomwalters@570 309
tomwalters@570 310 // single message tests
tomwalters@570 311 // empty message
tomwalters@570 312 {
tomwalters@570 313 memset( buffer, 0x74, bufferSize );
tomwalters@570 314 OutboundPacketStream ps( buffer, bufferSize );
tomwalters@570 315 ps << BeginMessage( "/no_arguments" )
tomwalters@570 316 << EndMessage;
tomwalters@570 317 assertEqual( ps.IsReady(), true );
tomwalters@570 318 ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );
tomwalters@570 319 std::cout << m << "\n";\
tomwalters@570 320 }
tomwalters@570 321
tomwalters@570 322 TEST_PACK_UNPACK( "/a_bool", true, bool, AsBool );
tomwalters@570 323 TEST_PACK_UNPACK( "/a_bool", false, bool, AsBool );
tomwalters@570 324 TEST_PACK_UNPACK( "/a_bool", (bool)1, bool, AsBool );
tomwalters@570 325
tomwalters@570 326 TEST_PACK_UNPACK0( "/nil", Nil, true, IsNil );
tomwalters@570 327 TEST_PACK_UNPACK0( "/inf", Infinitum, true, IsInfinitum );
tomwalters@570 328
tomwalters@570 329 TEST_PACK_UNPACK( "/an_int", (int32)1234, int32, AsInt32 );
tomwalters@570 330
tomwalters@570 331 TEST_PACK_UNPACK( "/a_float", 3.1415926f, float, AsFloat );
tomwalters@570 332
tomwalters@570 333 TEST_PACK_UNPACK( "/a_char", 'c', char, AsChar );
tomwalters@570 334
tomwalters@570 335 TEST_PACK_UNPACK( "/an_rgba_color", RgbaColor(0x22334455), uint32, AsRgbaColor );
tomwalters@570 336
tomwalters@570 337 TEST_PACK_UNPACK( "/a_midi_message", MidiMessage(0x7F), uint32, AsMidiMessage );
tomwalters@570 338
tomwalters@570 339 TEST_PACK_UNPACK( "/an_int64", (int64)(0xFFFFFFFF), int64, AsInt64 );
tomwalters@570 340
tomwalters@570 341 TEST_PACK_UNPACK( "/a_time_tag", TimeTag(0xFFFFFFFF), uint64, AsTimeTag );
tomwalters@570 342
tomwalters@570 343 TEST_PACK_UNPACK( "/a_double", (double)3.1415926, double, AsDouble );
tomwalters@570 344
tomwalters@570 345 // blob
tomwalters@570 346 {
tomwalters@570 347 char blobData[] = "abcd";
tomwalters@570 348 memset( buffer, 0x74, bufferSize );
tomwalters@570 349 OutboundPacketStream ps( buffer, bufferSize );
tomwalters@570 350 ps << BeginMessage( "/a_blob" )
tomwalters@570 351 << Blob( blobData, 4 )
tomwalters@570 352 << EndMessage;
tomwalters@570 353 assertEqual( ps.IsReady(), true );
tomwalters@570 354 ReceivedMessage m( ReceivedPacket(ps.Data(), ps.Size()) );
tomwalters@570 355 std::cout << m << "\n";
tomwalters@570 356
tomwalters@570 357 const void *value;
tomwalters@570 358 unsigned long size;
tomwalters@570 359 m.ArgumentsBegin()->AsBlob( value, size );
tomwalters@570 360 assertEqual( size, (unsigned long)4 );
tomwalters@570 361 assertEqual( (memcmp( value, blobData, 4 ) == 0), true );
tomwalters@570 362 }
tomwalters@570 363
tomwalters@570 364
tomwalters@570 365 TEST_PACK_UNPACK( "/a_string", "hello world", const char*, AsString );
tomwalters@570 366
tomwalters@570 367 TEST_PACK_UNPACK( "/a_symbol", Symbol("foobar"), const char*, AsSymbol );
tomwalters@570 368
tomwalters@570 369
tomwalters@570 370 // nested bundles, and multiple messages in bundles...
tomwalters@570 371
tomwalters@570 372 {
tomwalters@570 373 memset( buffer, 0x74, bufferSize );
tomwalters@570 374 OutboundPacketStream ps( buffer, bufferSize );
tomwalters@570 375 ps << BeginBundle()
tomwalters@570 376 << BeginMessage( "/message_one" ) << 1 << 2 << 3 << 4 << EndMessage
tomwalters@570 377 << BeginMessage( "/message_two" ) << 1 << 2 << 3 << 4 << EndMessage
tomwalters@570 378 << BeginMessage( "/message_three" ) << 1 << 2 << 3 << 4 << EndMessage
tomwalters@570 379 << BeginMessage( "/message_four" ) << 1 << 2 << 3 << 4 << EndMessage
tomwalters@570 380 << EndBundle;
tomwalters@570 381 assertEqual( ps.IsReady(), true );
tomwalters@570 382 ReceivedBundle b( ReceivedPacket(ps.Data(), ps.Size()) );
tomwalters@570 383 std::cout << b << "\n";
tomwalters@570 384 }
tomwalters@570 385 }
tomwalters@570 386
tomwalters@570 387
tomwalters@570 388 void RunUnitTests()
tomwalters@570 389 {
tomwalters@570 390 test1();
tomwalters@570 391 test2();
tomwalters@570 392 test3();
tomwalters@570 393 PrintTestSummary();
tomwalters@570 394 }
tomwalters@570 395
tomwalters@570 396 } // namespace osc
tomwalters@570 397
tomwalters@570 398
tomwalters@570 399 #ifndef NO_OSC_TEST_MAIN
tomwalters@570 400
tomwalters@570 401 int main(int argc, char* argv[])
tomwalters@570 402 {
tomwalters@570 403 (void)argc;
tomwalters@570 404 (void)argv;
tomwalters@570 405
tomwalters@570 406 osc::RunUnitTests();
tomwalters@570 407 }
tomwalters@570 408
tomwalters@570 409 #endif