i/testp
![]() |
/* TESTP.I Test of Yorick parser $Id: testp.i,v 1.1 1993/08/27 18:50:06 munro Exp munro $ */ /* Copyright (c) 1994. The Regents of the University of California. All rights reserved. */ goofs= 0; /* cumulative tally of errors detected */ write, "Begin Yorick parser test..."; if (do_stats) "A "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ /* First function is pure parser test, exercising many yucky language features, but not producing any usable procedure. Check disassembled function to be sure code is correct. */ func parser_test(pos1, pos2, pos3, .., key1=, key2=, key3=) { pos1= '\0'; pos2= 1s; pos3= 2n; loc1= 3L; loc2= 4.0e0F; loc3= 5.0; loc4= 6.0i; loc5= "A string with ' and /* inside."; /* Blank lines, then a short comment with imbedded " character */ /* A multiline comment with blank lines and various types of quote characters, such as " and ', all of which should be completely ignored... */ #if 0 Try commenting something out with #if 0/#endif sequence # if 0 These should nest properly... # endif ...So this line should still be commented out. #endif # if 0 Be sure indented style works. # endif // Comment out something with C++-style comment // ... and another comment /* // Nested comment test terrible syntax error */ // first commented out line; /* nested normal comment */ // second bad line; // third bad line; // fourth bad line; /* final nested comment key1= pos3; // C++ comment /* initial comment */ key2 /* imbedded comment */ = 0 /* repeated constant */ + 6.; /* followed by a second repeated constant */ key3= ext1; /* first example of an external variable // nest test */ local loc6; local loc7, loc8, loc9; // C++ style comment /* nesting */ extern ext2, ext3; extern ext4; ext2= -1; /* negative of existing constant */ loc6= - /* nasty imbedded comment */ 7.0; ext3= "multiline string also tests escape sequences: \ \\n\n, \\t\t, \\a\a, \\f\f, \\r\r, \\v\v, \\b\b, \', \"\n\ \?, \q, C-a\1, C-b\02, C-c\003, C-d\0041 (should C-d1), C-z\x1A,\ DEL\x7f"; /* Note: \? and \q should just give ? and q */ loc7= ext4+1; loc8= ext5(); /* should push nil argument */ ext5(pos1); ext5(pos1, key1, loc1); ext5(pos1, key1, .., loc1); ext5; ext5, pos1; ext5, pos1, key1, loc1, ext1, /* final argument nil */; /* Try lines with implicit semi-colon terminators: */ loc7(3:, 6*loc1+loc2, ::loc2+loc3)= 5 loc8= loc7 + 7* loc6(3, ) if (loc1) ext5 else ext5, 1 if (loc1) ext5 ext5, 1 /* Try several popular styles */ if (loc1) { ext3; } else if (!loc2) { ext3, 1; } else if (loc3) { ext3, 1; ext3, 2; } else { ext3, 3; } if (loc1) { ext4; } else if (loc2) { ext4, 1; } else if (!loc3) { ext4, 1; ext4, 2; } else { ext4, 3; } if (!loc1) ext5; else if (loc2) ext5, 1; else if (loc3) { ext5, 1; ext5, 2; } else ext5, 3; while (loc1--) { ext6; ext6, 2; }; /* check that extraneous trailing semi-colon is OK */ backward: do { ext6; if (ext1) break; if (ext2) continue; ext6, 2; } while (--loc1); if (ext6) goto forward; if (ext3) goto backward; for (loc1=0 ; loc1<8 ; loc1++) { ext5; ext5, 2; } forward: for (loc1=0, loc2=loc3=0 ; loc1<8 ; loc1++, loc2+=2, loc3+=3) { if (ext4>=9) continue; ext5; do { ext6; if (ext1!=3) break; for (loc1=0 ; loc1<8 ; loc1++) { ext5; if (ext3<=2) break; if (ext4==7) continue; if (!ext1) goto inloop; ext5, 2; } if (ext2) continue; ext6, 2; } while (--loc1); if (ext3>3) break; ext5, 2; inloop: } if (loc1 || loc2 && loc3) goto backward; return 3*loc1(3:12:3, ptp, avg:9:21)? 3+ext1 : 2-ext2; } if (do_stats) "B "+print(yorick_stats()); #if 0 Here is the correct disassemble output for parser_test: func parser_test(pos1,pos2,pos3,..,key1=,key2=,key3=) 17 sp->1 PushChar(0x00) 19 sp0>1 Define(pos1) 21 sp->0 DropTop 22 sp+>1 PushShort(1) 24 sp0>1 Define(pos2) 26 sp->0 DropTop 27 sp+>1 PushInt(2) 29 sp0>1 Define(pos3) 31 sp->0 DropTop 32 sp+>1 PushLong(3) 34 sp0>1 Define(loc1) 36 sp->0 DropTop 37 sp+>1 PushFloat(4) 39 sp0>1 Define(loc2) 41 sp->0 DropTop 42 sp+>1 PushDouble(5) 44 sp0>1 Define(loc3) 46 sp->0 DropTop 47 sp+>1 PushImaginary(6i) 49 sp0>1 Define(loc4) 51 sp->0 DropTop 52 sp+>1 PushString("A string with ' and /* i"...) 54 sp0>1 Define(loc5) 56 sp->0 DropTop 57 sp+>1 PushVariable(pos3) 59 sp0>1 Define(key1) 61 sp->0 DropTop 62 sp+>1 PushLong(0) 64 sp+>2 PushDouble(6) 66 sp->1 Add 67 sp0>1 Define(key2) 69 sp->0 DropTop 70 sp+>1 PushVariable(ext1) 72 sp0>1 Define(key3) 74 sp->0 DropTop 75 sp+>1 PushLong(-1) 77 sp0>1 Define(ext2) 79 sp->0 DropTop 80 sp+>1 PushDouble(-7) 82 sp0>1 Define(loc6) 84 sp->0 DropTop 85 sp+>1 PushString("multiline string also te"...) 87 sp0>1 Define(ext3) 89 sp->0 DropTop 90 sp+>1 PushVariable(ext4) 92 sp+>2 PushLong(1) 94 sp->1 Add 95 sp0>1 Define(loc7) 97 sp->0 DropTop 98 sp+>1 PushVariable(ext5) 100 sp+>2 PushNil 101 sp->1 Eval(1) 103 sp0>1 Define(loc8) 105 sp->0 DropTop 106 sp+>1 PushVariable(ext5) 108 sp+>2 PushReference(pos1) 110 sp->1 Eval(1) 112 sp0>1 Print 113 sp->0 DropTop 114 sp+>1 PushVariable(ext5) 116 sp+>2 PushReference(pos1) 118 sp+>3 PushReference(key1) 120 sp+>4 PushReference(loc1) 122 sp->1 Eval(3) 124 sp0>1 Print 125 sp->0 DropTop 126 sp+>1 PushVariable(ext5) 128 sp+>2 PushReference(pos1) 130 sp+>3 PushReference(key1) 132 sp+>4 FormRangeFlag(..) 134 sp+>5 PushReference(loc1) 136 sp->1 Eval(4) 138 sp0>1 Print 139 sp->0 DropTop 140 sp+>1 PushVariable(ext5) 142 sp0>1 Print 143 sp->0 DropTop 144 sp+>1 PushVariable(ext5) 146 sp+>2 PushReference(pos1) 148 sp->1 Eval(1) 150 sp->0 DropTop 151 sp+>1 PushVariable(ext5) 153 sp+>2 PushReference(pos1) 155 sp+>3 PushReference(key1) 157 sp+>4 PushReference(loc1) 159 sp+>5 PushReference(ext1) 161 sp+>6 PushNil 162 sp->1 Eval(5) 164 sp->0 DropTop 165 sp+>1 PushVariable(loc7) 167 sp+>2 PushLong(3) 169 sp+>3 PushNil 170 sp->2 FormRange(2) 172 sp+>3 PushLong(6) 174 sp+>4 PushVariable(loc1) 176 sp->3 Multiply 177 sp+>4 PushVariable(loc2) 179 sp->3 Add 180 sp+>4 PushNil 181 sp+>5 PushNil 182 sp+>6 PushVariable(loc2) 184 sp+>7 PushVariable(loc3) 186 sp->6 Add 187 sp->4 FormRange(3) 189 sp->1 Eval(3) 191 sp+>2 PushLong(5) 193 sp->1 Assign 194 sp->0 DropTop 195 sp+>1 PushVariable(loc7) 197 sp+>2 PushLong(7) 199 sp+>3 PushVariable(loc6) 201 sp+>4 PushLong(3) 203 sp+>5 PushNil 204 sp->3 Eval(2) 206 sp->2 Multiply 207 sp->1 Add 208 sp0>1 Define(loc8) 210 sp->0 DropTop 211 sp+>1 PushVariable(loc1) 213 sp->0 BranchFalse to pc= 221 215 sp+>1 PushVariable(ext5) 217 sp0>1 Print 218 sp->0 DropTop 219 sp0>0 Branch to pc= 228 221 sp+>1 PushVariable(ext5) 223 sp+>2 PushLong(1) 225 sp->1 Eval(1) 227 sp->0 DropTop 228 sp+>1 PushVariable(loc1) 230 sp->0 BranchFalse to pc= 236 232 sp+>1 PushVariable(ext5) 234 sp0>1 Print 235 sp->0 DropTop 236 sp+>1 PushVariable(ext5) 238 sp+>2 PushLong(1) 240 sp->1 Eval(1) 242 sp->0 DropTop 243 sp+>1 PushVariable(loc1) 245 sp->0 BranchFalse to pc= 253 247 sp+>1 PushVariable(ext3) 249 sp0>1 Print 250 sp->0 DropTop 251 sp0>0 Branch to pc= 293 253 sp+>1 PushVariable(loc2) 255 sp->0 BranchTrue to pc= 266 257 sp+>1 PushVariable(ext3) 259 sp+>2 PushLong(1) 261 sp->1 Eval(1) 263 sp->0 DropTop 264 sp0>0 Branch to pc= 293 266 sp+>1 PushVariable(loc3) 268 sp->0 BranchFalse to pc= 286 270 sp+>1 PushVariable(ext3) 272 sp+>2 PushLong(1) 274 sp->1 Eval(1) 276 sp->0 DropTop 277 sp+>1 PushVariable(ext3) 279 sp+>2 PushLong(2) 281 sp->1 Eval(1) 283 sp->0 DropTop 284 sp0>0 Branch to pc= 293 286 sp+>1 PushVariable(ext3) 288 sp+>2 PushLong(3) 290 sp->1 Eval(1) 292 sp->0 DropTop 293 sp+>1 PushVariable(loc1) 295 sp->0 BranchFalse to pc= 303 297 sp+>1 PushVariable(ext4) 299 sp0>1 Print 300 sp->0 DropTop 301 sp0>0 Branch to pc= 343 303 sp+>1 PushVariable(loc2) 305 sp->0 BranchFalse to pc= 316 307 sp+>1 PushVariable(ext4) 309 sp+>2 PushLong(1) 311 sp->1 Eval(1) 313 sp->0 DropTop 314 sp0>0 Branch to pc= 343 316 sp+>1 PushVariable(loc3) 318 sp->0 BranchTrue to pc= 336 320 sp+>1 PushVariable(ext4) 322 sp+>2 PushLong(1) 324 sp->1 Eval(1) 326 sp->0 DropTop 327 sp+>1 PushVariable(ext4) 329 sp+>2 PushLong(2) 331 sp->1 Eval(1) 333 sp->0 DropTop 334 sp0>0 Branch to pc= 343 336 sp+>1 PushVariable(ext4) 338 sp+>2 PushLong(3) 340 sp->1 Eval(1) 342 sp->0 DropTop 343 sp+>1 PushVariable(loc1) 345 sp->0 BranchTrue to pc= 353 347 sp+>1 PushVariable(ext5) 349 sp0>1 Print 350 sp->0 DropTop 351 sp0>0 Branch to pc= 393 353 sp+>1 PushVariable(loc2) 355 sp->0 BranchFalse to pc= 366 357 sp+>1 PushVariable(ext5) 359 sp+>2 PushLong(1) 361 sp->1 Eval(1) 363 sp->0 DropTop 364 sp0>0 Branch to pc= 393 366 sp+>1 PushVariable(loc3) 368 sp->0 BranchFalse to pc= 386 370 sp+>1 PushVariable(ext5) 372 sp+>2 PushLong(1) 374 sp->1 Eval(1) 376 sp->0 DropTop 377 sp+>1 PushVariable(ext5) 379 sp+>2 PushLong(2) 381 sp->1 Eval(1) 383 sp->0 DropTop 384 sp0>0 Branch to pc= 393 386 sp+>1 PushVariable(ext5) 388 sp+>2 PushLong(3) 390 sp->1 Eval(1) 392 sp->0 DropTop 393 sp+>1 PushVariable(loc1) 395 sp+>2 Push1 396 sp+>3 DupUnder 397 sp->2 Subtract 398 sp0>2 Define(loc1) 400 sp->1 DropTop 401 sp->0 BranchFalse to pc= 416 403 sp+>1 PushVariable(ext6) 405 sp0>1 Print 406 sp->0 DropTop 407 sp+>1 PushVariable(ext6) 409 sp+>2 PushLong(2) 411 sp->1 Eval(1) 413 sp->0 DropTop 414 sp0>0 Branch to pc= 393 416 sp+>1 PushVariable(ext6) 418 sp0>1 Print 419 sp->0 DropTop 420 sp+>1 PushVariable(ext1) 422 sp->0 BranchFalse to pc= 426 424 sp0>0 Branch to pc= 447 426 sp+>1 PushVariable(ext2) 428 sp->0 BranchFalse to pc= 432 430 sp0>0 Branch to pc= 439 432 sp+>1 PushVariable(ext6) 434 sp+>2 PushLong(2) 436 sp->1 Eval(1) 438 sp->0 DropTop 439 sp+>1 PushVariable(loc1) 441 sp+>2 Push1 442 sp->1 Subtract 443 sp0>1 Define(loc1) 445 sp->0 BranchTrue to pc= 416 447 sp+>1 PushVariable(ext6) 449 sp->0 BranchFalse to pc= 453 451 sp0>0 Branch to pc= 493 453 sp+>1 PushVariable(ext3) 455 sp->0 BranchFalse to pc= 459 457 sp0>0 Branch to pc= 416 459 sp+>1 PushLong(0) 461 sp0>1 Define(loc1) 463 sp->0 DropTop 464 sp+>1 PushVariable(loc1) 466 sp+>2 PushLong(8) 468 sp->1 Less 469 sp->0 BranchFalse to pc= 493 471 sp+>1 PushVariable(ext5) 473 sp0>1 Print 474 sp->0 DropTop 475 sp+>1 PushVariable(ext5) 477 sp+>2 PushLong(2) 479 sp->1 Eval(1) 481 sp->0 DropTop 482 sp+>1 PushVariable(loc1) 484 sp+>2 Push1 485 sp+>3 DupUnder 486 sp->2 Add 487 sp0>2 Define(loc1) 489 sp->1 DropTop 490 sp->0 DropTop 491 sp0>0 Branch to pc= 464 493 sp+>1 PushLong(0) 495 sp0>1 Define(loc1) 497 sp->0 DropTop 498 sp+>1 PushLong(0) 500 sp0>1 Define(loc3) 502 sp0>1 Define(loc2) 504 sp->0 DropTop 505 sp+>1 PushVariable(loc1) 507 sp+>2 PushLong(8) 509 sp->1 Less 510 sp->0 BranchFalse to pc= 660 512 sp+>1 PushVariable(ext4) 514 sp+>2 PushLong(9) 516 sp->1 GreaterEQ 517 sp->0 BranchFalse to pc= 521 519 sp0>0 Branch to pc= 633 521 sp+>1 PushVariable(ext5) 523 sp0>1 Print 524 sp->0 DropTop 525 sp+>1 PushVariable(ext6) 527 sp0>1 Print 528 sp->0 DropTop 529 sp+>1 PushVariable(ext1) 531 sp+>2 PushLong(3) 533 sp->1 NotEqual 534 sp->0 BranchFalse to pc= 538 536 sp0>0 Branch to pc= 617 538 sp+>1 PushLong(0) 540 sp0>1 Define(loc1) 542 sp->0 DropTop 543 sp+>1 PushVariable(loc1) 545 sp+>2 PushLong(8) 547 sp->1 Less 548 sp->0 BranchFalse to pc= 596 550 sp+>1 PushVariable(ext5) 552 sp0>1 Print 553 sp->0 DropTop 554 sp+>1 PushVariable(ext3) 556 sp+>2 PushLong(2) 558 sp->1 LessEQ 559 sp->0 BranchFalse to pc= 563 561 sp0>0 Branch to pc= 596 563 sp+>1 PushVariable(ext4) 565 sp+>2 PushLong(7) 567 sp->1 Equal 568 sp->0 BranchFalse to pc= 572 570 sp0>0 Branch to pc= 585 572 sp+>1 PushVariable(ext1) 574 sp->0 BranchTrue to pc= 578 576 sp0>0 Branch to pc= 633 578 sp+>1 PushVariable(ext5) 580 sp+>2 PushLong(2) 582 sp->1 Eval(1) 584 sp->0 DropTop 585 sp+>1 PushVariable(loc1) 587 sp+>2 Push1 588 sp+>3 DupUnder 589 sp->2 Add 590 sp0>2 Define(loc1) 592 sp->1 DropTop 593 sp->0 DropTop 594 sp0>0 Branch to pc= 543 596 sp+>1 PushVariable(ext2) 598 sp->0 BranchFalse to pc= 602 600 sp0>0 Branch to pc= 609 602 sp+>1 PushVariable(ext6) 604 sp+>2 PushLong(2) 606 sp->1 Eval(1) 608 sp->0 DropTop 609 sp+>1 PushVariable(loc1) 611 sp+>2 Push1 612 sp->1 Subtract 613 sp0>1 Define(loc1) 615 sp->0 BranchTrue to pc= 525 617 sp+>1 PushVariable(ext3) 619 sp+>2 PushLong(3) 621 sp->1 Greater 622 sp->0 BranchFalse to pc= 626 624 sp0>0 Branch to pc= 660 626 sp+>1 PushVariable(ext5) 628 sp+>2 PushLong(2) 630 sp->1 Eval(1) 632 sp->0 DropTop 633 sp+>1 PushVariable(loc1) 635 sp+>2 Push1 636 sp+>3 DupUnder 637 sp->2 Add 638 sp0>2 Define(loc1) 640 sp->1 DropTop 641 sp->0 DropTop 642 sp+>1 PushVariable(loc2) 644 sp+>2 PushLong(2) 646 sp->1 Add 647 sp0>1 Define(loc2) 649 sp->0 DropTop 650 sp+>1 PushVariable(loc3) 652 sp+>2 PushLong(3) 654 sp->1 Add 655 sp0>1 Define(loc3) 657 sp->0 DropTop 658 sp0>0 Branch to pc= 505 660 sp+>1 PushVariable(loc1) 662 sp->0 BranchTrue to pc= 673 664 sp+>1 PushVariable(loc2) 666 sp->0 BranchFalse to pc= 671 668 sp+>1 PushVariable(loc3) 670 sp==0 AndOrLogical for && 671 sp+>1 Push0 672 sp==0 AndOrLogical for || 673 sp+>1 Push1 674 sp->0 BranchFalse to pc= 678 676 sp0>0 Branch to pc= 416 678 sp+>1 PushLong(3) 680 sp+>2 PushVariable(loc1) 682 sp+>3 PushLong(3) 684 sp+>4 PushLong(12) 686 sp+>5 PushLong(3) 688 sp->3 FormRange(3) 690 sp+>4 FormRangeFunc(ptp:) 692 sp+>5 PushLong(9) 694 sp+>6 PushLong(21) 696 sp->5 FormRange(2) 698 sp0>5 AddRangeFunc(avg:) 700 sp->2 Eval(3) 702 sp->1 Multiply 703 sp->0 BranchFalse to pc= 712 705 sp+>1 PushLong(3) 707 sp+>2 PushVariable(ext1) 709 sp->1 Add 710 sp0>1 Branch to pc= 717 712 sp+>1 PushLong(2) 714 sp+>2 PushVariable(ext2) 716 sp->1 Subtract 717 sp->0 Return 718 sp==0 Halt-Virtual-Machine #endif /* Try reinstated line */ junk= 1; #if 1 junk= 0; # if 0 junk= 2; # endif #endif if (junk) { goofs++; "**FAILURE** #if / #endif construction broken"; } /* ------------------------------------------------------------------------- */ f= open("../i/testp.i", "r", 1); if (is_void(f)) f= open(Y_SITE+"i/testp.i", "r", 1); if (f) { while (!strmatch((line= rdline(f)), "Here is the correct disassemble")); correct= []; while (!strmatch((line= rdline(f)), "#endif")) grow, correct, line; close, f; if (anyof(disassemble(parser_test)!=correct)) { goofs++; "**FAILURE** of the parser_test disassembly"; " -- writing disassmbly of parser_test to pjunk.jnk"; f= open("pjunk.jnk", "w"); write, f, format="%s\n", disassemble(parser_test); close, f; } correct= []; } else { "WARNING-- skipping disassembly check, include/testp.i not present"; } parser_test= []; /* Check for limitation on yacc-parser stack depth. If this fails with a SYNTAX error like "yacc stack overflow", see top of yorick.y source-- your yacc may have a switch to fix it. */ { if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else if (1) x= [1, 2]; else x= [1,2]; } x= []; /* If following lines give syntax errors, something is wrong with the NumberValue routine in Yorick/yorick.c */ if (abs(100000000000000000000.0-1.e20)>1.e11) write, "**WARNING** problem with numeric conversions"; if (0xffffffff != ((0xffff<<16)|0xffff)) write, "**WARNING** problem with strtoul?"; /* test basic flow control statements */ i= 0; do { i++; } while (i<20); if (i!=20) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; for (i=0 ; i<20 ; ++i); if (i!=20) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; i= 0; while (i<20) ++i; if (i!=20) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; i= j= 0; do { i++; if (i>15) break; else if (i>5) continue; j++; } while (i<20); if (i!=16 || j!=5) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; for (i=j=0 ; i<20 ; ++i) { if (i>15) break; if (i>10) continue; ++j; } if (i!=16 || j!=11) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; i= j= 0; while (i<20) { ++i; if (i>15) break; if (i>10) continue; ++j; } if (i!=16 || j!=10) error, "***PARSER BUG*** try recompiling Yorick/parse.c unoptimized"; if (do_stats) "C "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test 17x10x10 binary operators..."; /* Test all binary operations. There are 10 data types and 17 operators, so the complete test involves 1700 function calls... */ iS= 1n; lS= 1; dS= 1.0 cA= ['\1', '\2']; sA= [1s, 2s]; iA= [1n, 2n]; lA= [1, 2]; fA= [1.0f, 2.0f]; dA= [1., 2.]; zA= [1+0i, 2+0i]; func op_test(SS, AS, SA, AA, op_name) /* SS, .. AA are correct answers */ { extern op; /* the function to be tested */ goof= array(1, 10, 10); /* array to hold any mistakes */ except_complex= only_integer= goof; except_complex(10,)= except_complex(,10)= 0; only_integer(3,)= only_integer(,3)= 0; only_integer(8:,)= 0; only_integer(,8:)= 0; answer= SS; op,iS,iS,1,1; op,lS,iS,2,1; op,dS,iS,3,1; op,iS,lS,1,2; op,lS,lS,2,2; op,dS,lS,3,2; op,iS,dS,1,3; op,lS,dS,2,3; op,dS,dS,3,3; answer= AS; op,cA,iS,4,1; op,sA,iS,5,1; op,iA,iS,6,1; op,lA,iS,7,1; op,fA,iS,8,1; op,dA,iS,9,1; op,zA,iS,10,1; op,cA,lS,4,2; op,sA,lS,5,2; op,iA,lS,6,2; op,lA,lS,7,2; op,fA,lS,8,2; op,dA,lS,9,2; op,zA,lS,10,2; op,cA,dS,4,3; op,sA,dS,5,3; op,iA,dS,6,3; op,lA,dS,7,3; op,fA,dS,8,3; op,dA,dS,9,3; op,zA,dS,10,3; answer= SA; op,iS,cA,1,4; op,iS,sA,1,5; op,iS,iA,1,6; op,iS,lA,1,7; op,iS,fA,1,8; op,iS,dA,1,9; op,iS,zA,1,10; op,lS,cA,2,4; op,lS,sA,2,5; op,lS,iA,2,6; op,lS,lA,2,7; op,lS,fA,2,8; op,lS,dA,2,9; op,lS,zA,2,10; op,dS,cA,3,4; op,dS,sA,3,5; op,dS,iA,3,6; op,dS,lA,3,7; op,dS,fA,3,8; op,dS,dA,3,9; op,dS,zA,3,10; answer= AA; op,cA,cA,4,4; op,cA,sA,4,5; op,cA,iA,4,6; op,cA,lA,4,7; op,cA,fA,4,8; op,cA,dA,4,9; op,cA,zA,4,10; op,sA,cA,5,4; op,sA,sA,5,5; op,sA,iA,5,6; op,sA,lA,5,7; op,sA,fA,5,8; op,sA,dA,5,9; op,sA,zA,5,10; op,iA,cA,6,4; op,iA,sA,6,5; op,iA,iA,6,6; op,iA,lA,6,7; op,iA,fA,6,8; op,iA,dA,6,9; op,iA,zA,6,10; op,lA,cA,7,4; op,lA,sA,7,5; op,lA,iA,7,6; op,lA,lA,7,7; op,lA,fA,7,8; op,lA,dA,7,9; op,lA,zA,7,10; op,fA,cA,8,4; op,fA,sA,8,5; op,fA,iA,8,6; op,fA,lA,8,7; op,fA,fA,8,8; op,fA,dA,8,9; op,fA,zA,8,10; op,dA,cA,9,4; op,dA,sA,9,5; op,dA,iA,9,6; op,dA,lA,9,7; op,dA,fA,9,8; op,dA,dA,9,9; op,dA,zA,9,10; op,zA,cA,10,4; op,zA,sA,10,5; op,zA,iA,10,6; op,zA,lA,10,7; op,zA,fA,10,8; op,zA,dA,10,9; op,zA,zA,10,10; if (anyof(goof)) { goofs++; "**FAILURE** of the following operations "+op_name+":"; where2(goof); } } if (do_stats) "D "+print(yorick_stats()); func op(l, r, il, ir) { goof(il, ir)= anyof((l + r)!=answer); } op_test, 2, [2, 3], [2, 3], [2, 4], "+"; func op(l, r, il, ir) { goof(il, ir)= anyof((l - r)!=answer); } op_test, 0, [0, 1], [0, -1], [0, 0], "-"; func op(l, r, il, ir) { goof(il, ir)= anyof((l * r)!=answer); } op_test, 1, [1, 2], [1, 2], [1, 4], "*"; func op(l, r, il, ir) { if (structof(l+r)!=structof(l+r+0.0f)) goof(il, ir)= anyof((l / r)!=structof(l+r)(answer)); else /* otherwise fails on Crays because division is inexact */ goof(il, ir)= anyof(abs((l / r) - answer) > 1.e-6); } op_test, 1, [1, 2], [1, 0.5], [1, 1], "/"; func op(l, r, il, ir) { if (structof(r)!=structof(r+0.0f)) goof(il, ir)= anyof((l ^ r)!=answer); else /* otherwise fails on MacIntosh for unknown reason */ goof(il, ir)= anyof(abs((l ^ r) - answer) > 1.e-6); } op_test, 1, [1, 2], [1, 1], [1, 4], "^"; func op(l, r, il, ir) { goof(il, ir)= anyof((l == r)!=answer); } op_test, 1, [1, 0], [1, 0], [1, 1], "=="; func op(l, r, il, ir) { goof(il, ir)= anyof((l != r)!=answer); } op_test, 0, [0, 1], [0, 1], [0, 0], "!="; func op(l, r, il, ir) { goof(il, ir)= except_complex(il, ir) && anyof((l % r)!=answer); } op_test, 0, [0, 0], [0, 1], [0, 0], "%"; func op(l, r, il, ir) { goof(il, ir)= except_complex(il, ir) && anyof((l > r)!=answer); } op_test, 0, [0, 1], [0, 0], [0, 0], ">"; func op(l, r, il, ir) { goof(il, ir)= except_complex(il, ir) && anyof((l <= r)!=answer); } op_test, 1, [1, 0], [1, 1], [1, 1], "<="; func op(l, r, il, ir) { goof(il, ir)= except_complex(il, ir) && anyof((l < r)!=answer); } op_test, 0, [0, 0], [0, 1], [0, 0], "<"; func op(l, r, il, ir) { goof(il, ir)= except_complex(il, ir) && anyof((l >= r)!=answer); } op_test, 1, [1, 1], [1, 0], [1, 1], ">="; func op(l, r, il, ir) { goof(il, ir)= only_integer(il, ir) && anyof((l << r)!=answer); } op_test, 2, [2, 4], [2, 4], [2, 8], "<<"; func op(l, r, il, ir) { goof(il, ir)= only_integer(il, ir) && anyof((l >> r)!=answer); } op_test, 0, [0, 1], [0, 0], [0, 0], ">>"; func op(l, r, il, ir) { goof(il, ir)= only_integer(il, ir) && anyof((l & r)!=answer); } op_test, 1, [1, 0], [1, 0], [1, 2], "&"; func op(l, r, il, ir) { goof(il, ir)= only_integer(il, ir) && anyof((l | r)!=answer); } op_test, 1, [1, 3], [1, 3], [1, 2], "|"; func op(l, r, il, ir) { goof(il, ir)= only_integer(il, ir) && anyof((l ~ r)!=answer); } op_test, 0, [0, 3], [0, 3], [0, 0], "~"; op= op_test= []; if (do_stats) "E "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test unary operators..."; /* Test all unary operators. */ func op_test(SS, AA, op_name) /* SS, AA are correct answers */ { extern op; /* the function to be tested */ goof= array(1, 10); /* array to hold any mistakes */ except_complex= only_integer= goof; except_complex(10)= 0; only_integer(3)= 0; only_integer(8:)= 0; answer= SS; op,iS,1; op,lS,2; op,dS,3; answer= AA&0xff; op,cA,4; answer= AA; op,sA,5; op,iA,6; op,lA,7; op,fA,8; op,dA,9; op,zA,10; if (anyof(goof)) { goofs++; "**FAILURE** of the following operations "+op_name+":"; where2(goof); } } if (do_stats) "F "+print(yorick_stats()); func op(l, il) { goof(il)= anyof((+ l)!=answer); } op_test, 1, [1, 2], "+"; func op(l, il) { goof(il)= anyof((- l)!=answer); } op_test, -1, [-1, -2], "-"; func op(l, il) { goof(il)= anyof((! (l-1))!=answer); } op_test, 1, [1, 0], "!"; func op(l, il) { goof(il)= only_integer(il) && anyof((~ l)!=answer); } op_test, -2, [-2, -3], "~"; op= op_test= []; if (do_stats) "G "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test array manipulation functions..."; /* Test array manipulation functions. */ func not_near (x,y) { return anyof(abs(x-y)>1.e-9); } x= [0,1](-,) + [0,10,20](-,-,) + [0,100,200,300](-,-,-,) + [0,1000,2000,3000,4000](-,-,-,-,) + [0,10000,20000,30000,40000,50000](-,-,-,-,-,); if (x(1,2,3,4,5,6)!=54321 || x(1,2,1,1,3,4)!=32001) { goofs++; "**FAILURE** of - subscript or broadcasting"; } y= []; grow, y, -2; if (anyof(y!=-2)) { goofs++; "**FAILURE** of grow test 1"; } grow, y, [1,2,3]; if (anyof(y!=[-2,1,2,3])) { goofs++; "**FAILURE** of grow test 2"; } grow, y, [6,5,4]; if (anyof(y!=[-2,1,2,3,6,5,4])) { goofs++; "**FAILURE** of grow test 3"; } y= [[1,2,3],[4,5,6]]; grow, y, -1; if (anyof(y!=[[1,2,3],[4,5,6],[-1,-1,-1]])) { goofs++; "**FAILURE** of grow test 4"; } grow, y, [6,5,4]; if (anyof(y!=[[1,2,3],[4,5,6],[-1,-1,-1],[6,5,4]])) { goofs++; "**FAILURE** of grow test 5"; } if (indgen(0)!=orgsof([1])(1) || anyof(indgen(5)!=[0,1,2,3,4]+indgen(0))) { goofs++; "**FAILURE** of indgen function"; } if (not_near(span(1,4,4), [1,2,3,4]) || not_near(span(0,[2,4],3), [[0,1,2],[0,2,4]]) || not_near(span(0,[2,4],3,0), [[0,0],[1,2],[2,4]]) || not_near(spanl(1,8,4), [1,2,4,8]) || not_near(spanl(1,[4,16],3,0), [[1,1],[2,4],[4,16]])) { goofs++; "**FAILURE** of span or spanl function"; } y= [0., 1, 2, 3, 4, 5, 6, 7, 8, 9]; if (digitize(3.5, y)!=5 || anyof(digitize([[-5, 8.5],[11,5],[.5,-.5]],y)!=[[1,10],[11,7],[2,1]]) || anyof(digitize([[-5, 8.5],[11,5],[.5,-.5]],y(::-1))!= [[11,2],[1,5],[10,11]])) { goofs++; "**FAILURE** of digitize function"; } if (interp(y, y, 3.5)!=3.5 || anyof(interp(y,y,[[-5, 8.5],[11,5],[.5,-.5]])!=[[0,8.5],[9,5],[.5,0]]) || anyof(interp([y,y],y,[[-5, 8.5],[11,5],[.5,-.5]])!= [[[0,8.5],[9,5],[.5,0]],[[0,8.5],[9,5],[.5,0]]]) || anyof(interp(transpose([y,y]),y,[[-5, 8.5],[11,5],[.5,-.5]],0)!= [[[0,0],[8.5,8.5]],[[9,9],[5,5]],[[.5,.5],[0,0]]])) { goofs++; "**FAILURE** of interp function"; } if (not_near(integ(y, y, 3.5), 0.5*3.5^2) || not_near(integ(y,y,[[-5, 8.5],[11,5],[.5,-.5]]), 0.5*[[0,8.5],[9,5],[.5,0]]^2)) { goofs++; "**FAILURE** of integ function"; } if (anyof(histogram([1,5,2,1,1,5,2,1,4,5])!=[4,2,0,1,3]) || anyof(histogram([1,5,2,1,1,5,2,1,4,5],top=7)!=[4,2,0,1,3,0,0]) || anyof(histogram([1,5,2,1,1,5,2,1,4,5],y,top=7)!= [14.,8.,0.,8.,15.,0.,0.])) { goofs++; "**FAILURE** of histogram function"; } if (anyof(poly([0.,1.,2.], 1,-2,1)!=[1.,0.,1.]) || anyof(poly([0.,1.,2.], 1,[-2,-1,0],1)!=[1.,1.,5.])) { goofs++; "**FAILURE** of poly function"; } if (anyof(sort([5,1,7,3])!=[2,4,1,3]) || anyof(sort([5.,1.,7.,3.])!=[2,4,1,3]) || anyof(sort(["go", "a", "stay", "abc"])!=[2,4,1,3]) || median([5.,1.,7.,3.])!=4 || median([5.,1.,7.,3.,-2500.])!=3 || anyof(median([[5.,1.,7.,3.],[5.,1.,99.,3.]])!=[4,4]) || anyof(median([[5.,5.],[-55.,1.],[7.,99.],[3.,3.]],0)!=[4,4])) { goofs++; "**FAILURE** of sort or median function"; } if (anyof(dimsof(x) != [6, 1,2,3,4,5,6]) || anyof(dimsof(transpose(x)) != [6, 6,2,3,4,5,1]) || anyof(dimsof(transpose(x,[1,2])) != [6, 2,1,3,4,5,6]) || anyof(dimsof(transpose(x,[1,0])) != [6, 6,2,3,4,5,1]) || anyof(dimsof(transpose(x,2)) != [6, 6,1,2,3,4,5]) || anyof(dimsof(transpose(x,0)) != [6, 2,3,4,5,6,1]) || anyof(dimsof(transpose(x,3)) != [6, 5,6,1,2,3,4]) || anyof(dimsof(transpose(x,[4,6,3],[2,5])) != [6, 1,5,6,3,2,4])) { goofs++; "**FAILURE** of transpose test 1"; } y= transpose(x,[4,6,3],[2,5]); if (y(1,5,6,3,2,4)!=x(1,2,3,4,5,6) || y(1,3,4,1,2,1)!=x(1,2,1,1,3,4)) { goofs++; "**FAILURE** of transpose test 2"; } x= y= []; if (do_stats) "H "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test struct instancing and indexing..."; /* Test structs. */ struct Stest { char a; short b; double c(4); int d(2,3), e(5); complex f(2); } x= Stest(a='A', b=13, c=[2,-4,6,-8], d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]); if (x.a!='A' || x.b!=13 || anyof(x.c!=[2.,-4.,6.,-8.]) || anyof(x.d!=[[-1,2],[-3,4],[-5,6]]) || anyof(x.e!=[10,20,30,40,50]) || anyof(x.f!=[1i,2-2i])) { goofs++; "**FAILURE** of - struct instance declaration"; } y= array(Stest, 2); y(..)= x; y.a(2)= 'B'; y(2).b= -x.b; y.c(..,2)= x.c(::-1); y(2).d(,1:2)= transpose(x.d(,1:2)); y.e(::-1,2)= x.e; y(2).f= conj(x.f); if (x!=y(1) || y(2).a!='B' || y(2).b!=-13 || anyof(y(2).c!=[-8.,6.,-4.,2.]) || anyof(y(2).d!=[[-1,-3],[2,4],[-5,6]]) || anyof(y(2).e!=[50,40,30,20,10]) || anyof(y(2).f!=[-1i,2+2i])) { goofs++; "**FAILURE** of - struct instance array indexing"; } x= y= []; if (do_stats) "I "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test range functions..."; /* Test range functions. */ x= [[[3,7,5],[-4,2,-6]], [[-1,-4,-2],[0,4,8]], [[-1,-5,2],[1,0,0]], [[9,8,7],[-9,9,-6]]]; y= x+0.5; if (anyof(x(,-:1:2,,1)!=[[[3,7,5],[3,7,5]],[[-4,2,-6],[-4,2,-6]]])) { goofs++; "**FAILURE** of - pseudo range function (-)"; } if (anyof(x(,..)!=x) || anyof(x(..,:)!=x) || anyof(x(,*)!=x(,1:8)) || anyof(x(*,)!=x(1:6,1,))) { goofs++; "**FAILURE** of - rubber range function (.. or *)"; } if (anyof(x(,pcen,)(,uncp,)!=x) || anyof(y(,pcen,)(,uncp,)!=y)) { goofs++; "**FAILURE** of - uncp range function"; } if (anyof(x(,pcen,)(,2:-1,)!=x(,zcen,)) || anyof(x(,pcen,)(,1,)!=x(,1,)) || anyof(x(,pcen,)(,0,)!=x(,0,)) || anyof(y(,pcen,)!=x(,pcen,)+0.5)) { goofs++; "**FAILURE** of - pcen range function"; } if (anyof(x(,zcen,)!=[[[-.5,4.5,-.5]],[[-.5,0,3]], [[0,-2.5,1]],[[0,8.5,.5]]]) || anyof(y(,zcen,)!=[[[-.5,4.5,-.5]],[[-.5,0,3]], [[0,-2.5,1]],[[0,8.5,.5]]] + 0.5)) { goofs++; "**FAILURE** of - zcen range function"; } if (anyof(x(,dif,)!=[[[-7,-5,-11]],[[1,8,10]],[[2,5,-2]],[[-18,1,-13]]]) || anyof(y(,dif,)!=[[[-7,-5,-11]],[[1,8,10]],[[2,5,-2]],[[-18,1,-13]]])) { goofs++; "**FAILURE** of - dif range function"; } if (anyof(x(,psum,)!=[[[3,7,5],[-1,9,-1]], [[-1,-4,-2],[-1,0,6]], [[-1,-5,2],[0,-5,2]], [[9,8,7],[0,17,1]]]) || anyof(y(,psum,)!=[[[3,7,5],[-1,9,-1]], [[-1,-4,-2],[-1,0,6]], [[-1,-5,2],[0,-5,2]], [[9,8,7],[0,17,1]]] + [0.5,1.0](-,))) { goofs++; "**FAILURE** of - psum range function"; } if (anyof(x(,cum,)!=[[[0,0,0],[3,7,5],[-1,9,-1]], [[0,0,0],[-1,-4,-2],[-1,0,6]], [[0,0,0],[-1,-5,2],[0,-5,2]], [[0,0,0],[9,8,7],[0,17,1]]]) || anyof(y(,cum,)!=[[[0,0,0],[3,7,5],[-1,9,-1]], [[0,0,0],[-1,-4,-2],[-1,0,6]], [[0,0,0],[-1,-5,2],[0,-5,2]], [[0,0,0],[9,8,7],[0,17,1]]] + [0.0,0.5,1.0](-,))) { goofs++; "**FAILURE** of - cum range function"; } if (anyof(x(zcen,dif,)!=[[[-6,-8]],[[4.5,9]],[[3.5,1.5]],[[-8.5,-6]]]) || anyof(y(zcen,dif,)!=[[[-6,-8]],[[4.5,9]],[[3.5,1.5]],[[-8.5,-6]]])) { goofs++; "**FAILURE** of - zcen,dif multiple range function"; } if (anyof(x(min,,max)!=[7,0]) || anyof(y(,,max)(min,)!=[7,1]+0.5)) { goofs++; "**FAILURE** of - min or max range function"; } if (anyof(x(,ptp,)!=[[-7,-5,-11],[1,8,10],[2,5,-2],[-18,1,-13]]) || anyof(y(,ptp,)!=[[-7,-5,-11],[1,8,10],[2,5,-2],[-18,1,-13]])) { goofs++; "**FAILURE** of - ptp range function"; } if (anyof(x(,mnx,)!=[[2, 2, 2], [1, 1, 1], [1, 1, 2], [2, 1, 2]]) || anyof(y(,mnx,)!=[[2, 2, 2], [1, 1, 1], [1, 1, 2], [2, 1, 2]])) { goofs++; "**FAILURE** of - mnx range function"; } if (anyof(x(,mxx,)!=3-x(,mnx,)) || anyof(y(,mxx,)!=3-y(,mnx,))) { goofs++; "**FAILURE** of - mxx range function"; } if (anyof(x(,sum,)!=x(,1,)+x(,2,)) || anyof(y(,sum,)!=y(,1,)+y(,2,))) { goofs++; "**FAILURE** of - sum range function"; } if (anyof(x(,avg,)!=0.5*(x(,1,)+x(,2,))) || anyof(y(,avg,)!=0.5*(y(,1,)+y(,2,)))) { goofs++; "**FAILURE** of - avg range function"; } if (anyof(abs(x(,rms,)-0.5*abs(x(,1,)-x(,2,)))>1.e-10) || anyof(abs(y(,rms,)-0.5*abs(y(,1,)-y(,2,)))>1.e-10)) { goofs++; "**FAILURE** of - rms range function"; } x= [[1,2,3],[-5,5,-8]]; y= [[1,1],[-1,-1],[0,1]]; if (anyof(x(+,)*y(,+) != [[-1,-10],[2,-18]]) || anyof(x(,+)*y(+,) != [[-4,7,-5],[4,-7,5],[-5,5,-8]])) { goofs++; "**FAILURE** of + matrix multiply function"; } x+= 0i; if (anyof(x(+,)*y(,+) != [[-1,-10],[2,-18]]) || anyof(x(,+)*y(+,) != [[-4,7,-5],[4,-7,5],[-5,5,-8]])) { goofs++; "**FAILURE** of + complex matrix multiply function"; } /* first test matrix multiply conformability rules -- this will just blow up if there's a problem */ rop= lop= array(0., 4, 3, 2); dst= lop(+,,)*rop(+,,) + array(0., 3,2,3,2); dst= lop(,+,)*rop(,+,) + array(0., 4,2,4,2); dst= lop(,,+)*rop(,,+) + array(0., 4,3,4,3); rop= transpose(rop, 2); dst= lop(+,,)*rop(,+,) + array(0., 3,2,2,3); dst= lop(,+,)*rop(,,+) + array(0., 4,2,2,4); dst= lop(,,+)*rop(+,,) + array(0., 4,3,4,3); rop= transpose(rop, 2); dst= lop(+,,)*rop(,,+) + array(0., 3,2,3,2); dst= lop(,+,)*rop(+,,) + array(0., 4,2,2,4); dst= lop(,,+)*rop(,+,) + array(0., 4,3,3,4); /* next, try to exercise all the branches of the matrix multiply routines -- test all five dimensions, plus unit length leading dimension (special branch) */ lop= [[[1,2],[3,4]],[[5,6],[7,8]]]; rop= lop+10; dst1= lop(,+,)*rop(,+,); dst2= lop(1,+,)*rop(,+,); if (anyof(dst1!= [[[[50,74],[146,170]],[[54,80], [158,184]]], [[[66,98],[194,226]],[[70,104],[206,240]]]]) || anyof(dst2!= [[[50,146],[54,158]],[[66,194],[70,206]]])) { goofs++; "**FAILURE** of + matrix multiply function"; } lop+= 0i; rop+= 0i; dst1= lop(,+,)*rop(,+,); dst2= lop(1,+,)*rop(,+,); if (anyof(dst1!= [[[[50,74],[146,170]],[[54,80], [158,184]]], [[[66,98],[194,226]],[[70,104],[206,240]]]]) || anyof(dst2!= [[[50,146],[54,158]],[[66,194],[70,206]]])) { goofs++; "**FAILURE** of + complex matrix multiply function"; } x= y= lop= rop= dst1= dst2= []; if (do_stats) "J "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test math functions..."; /* Test math functions. */ x= pi/4; y= [3*pi/4, pi/6]; if (not_near(sin(x),sqrt(0.5)) || not_near(sin(y),[sqrt(0.5),0.5]) || not_near(cos(x),sqrt(0.5)) || not_near(cos(y),[-sqrt(0.5),sqrt(.75)]) || not_near(tan(x),1) || not_near(tan(y),[-1,1/sqrt(3)])) { goofs++; "**FAILURE** of - sin, cos, tan, or sqrt function"; } if (not_near(asin(sqrt(0.5)),x) || not_near(asin([sqrt(0.5),0.5]),y-[pi/2,0]) || not_near(acos(sqrt(0.5)),x) || not_near(acos([-sqrt(0.5),sqrt(.75)]),y) || not_near(atan(1),x) || not_near(atan([-1,1/sqrt(3)]),y-[pi,0])) { goofs++; "**FAILURE** of - asin, acos, atan, or sqrt function"; } if (not_near(atan(5,5),x) || not_near(atan([.1,1],[-.1,sqrt(3)]),y)) { goofs++; "**FAILURE** of - 2 argument atan function"; } if (not_near(exp(1i*x),cos(x)+1i*sin(x)) || not_near(exp(1i*y),cos(y)+1i*sin(y)) || not_near(cos(1i*x), 0.5*(exp(-x)+exp(x))) || not_near(cos(1i*y), 0.5*(exp(-y)+exp(y))) || not_near(sin(1i*x), 0.5i*(exp(x)-exp(-x))) || not_near(sin(1i*y), 0.5i*(exp(y)-exp(-y))) || not_near(tan(1i*x), 1i*(exp(x)-exp(-x))/(exp(-x)+exp(x))) || not_near(tan(1i*y), 1i*(exp(y)-exp(-y))/(exp(-y)+exp(y)))) { goofs++; "**FAILURE** of - (complex) exp, sin, cos, or tan function"; } if (not_near(exp(1),2.718281828459) || not_near(exp([-.5,2.5]), [1,exp(1)^3]/sqrt(exp(1))) || not_near(exp(x),cosh(x)+sinh(x)) || not_near(exp(y),cosh(y)+sinh(y)) || not_near(cosh(x), 0.5*(exp(-x)+exp(x))) || not_near(cosh(y), 0.5*(exp(-y)+exp(y))) || not_near(sinh(x), 0.5*(exp(x)-exp(-x))) || not_near(sinh(y), 0.5*(exp(y)-exp(-y))) || not_near(tanh(x), (exp(x)-exp(-x))/(exp(-x)+exp(x))) || not_near(tanh(y), (exp(y)-exp(-y))/(exp(-y)+exp(y)))) { goofs++; "**FAILURE** of - exp, sinh, cosh, or tanh function"; } if (not_near(sech(x), 2/(exp(-x)+exp(x))) || not_near(sech(y), 2/(exp(-y)+exp(y))) || not_near(csch(x), 2/(exp(x)-exp(-x))) || not_near(csch(y), 2/(exp(y)-exp(-y))) || anyof(sech([1.e6,-1.e6])) || anyof(csch([1.e6,-1.e6]))) { goofs++; "**FAILURE** of - sech or csch function"; } if (not_near(acosh(cosh(x)), x) || not_near(acosh(cosh(y)), y) || not_near(asinh(sinh(x)), x) || not_near(asinh(sinh(y)), y) || not_near(atanh(tanh(x)), x) || not_near(atanh(tanh(y)), y)) { goofs++; "**FAILURE** of - acosh, asinh, or atanh function"; } if (not_near(exp(1i*x),cosh(1i*x)+sinh(1i*x)) || not_near(exp(1i*y),cosh(1i*y)+sinh(1i*y)) || not_near(cosh(1i*x), 0.5*(exp(-1i*x)+exp(1i*x))) || not_near(cosh(1i*y), 0.5*(exp(-1i*y)+exp(1i*y))) || not_near(sinh(1i*x), 0.5*(exp(1i*x)-exp(-1i*x))) || not_near(sinh(1i*y), 0.5*(exp(1i*y)-exp(-1i*y))) || not_near(tanh(1i*x), (exp(1i*x)-exp(-1i*x))/(exp(-1i*x)+exp(1i*x))) || not_near(tanh(1i*y), (exp(1i*y)-exp(-1i*y))/(exp(-1i*y)+exp(1i*y)))) { goofs++; "**FAILURE** of - (complex) exp, sinh, cosh, or tanh function"; } if (not_near(log(exp(x)), x) || not_near(log(exp(y)), y) || not_near(log10(10^x), x) || not_near(log10(10^y), y) || not_near(log10(x*y),log10(x)+log10(y)) || not_near(log(x*y),log(x)+log(y)) || not_near(exp(x+y),exp(x)*exp(y)) || not_near(log10([1.e5,1.e-7]),[5,-7]) || not_near(log(10),1/log10(exp(1))) || not_near(log(10)*log10(x),log(x)) || not_near(log(10)*log10(y),log(y))) { goofs++; "**FAILURE** of - log, log10, or exp function"; } if (anyof(abs(x)!=x) || anyof(abs(-x)!=x) || anyof(abs(y)!=y) || anyof(abs(-y)!=y)) { goofs++; "**FAILURE** of - abs function"; } if (anyof(ceil(3.7)!=4) || anyof(ceil([-3.7,2.1])!=[-3,3]) || anyof(floor(3.7)!=3) || anyof(floor([-3.7,2.1])!=[-4,2])) { goofs++; "**FAILURE** of - ceil or floor function"; } if (not_near(abs(x,y,x,y),sqrt(2*(x^2+y^2)))) { goofs++; "**FAILURE** of - multiargument abs function"; } if (anyof(sign(x)!=1) || anyof(sign(-x)!=-1) || anyof(sign(y)!=1) || anyof(sign(-y)!=-1) || sign(0)!=1 || sign(0.0)!=1 || sign(0i)!=1 || not_near(sign(exp(1i*y+x)),exp(1i*y))) { goofs++; "**FAILURE** of - sign function"; } if (conj(x+1i)!=x-1i || anyof(conj(y+1i)!=y-1i)) { goofs++; "**FAILURE** of - conj function"; } if (random()<0.0 || random()>1.0 || anyof(dimsof(random(3,4,2))!=[3,3,4,2])) { goofs++; "**FAILURE** of - random function"; } if (min(x)!=x || min(y)!=pi/6 || anyof(min(x,y)!=[pi/4,pi/6]) || max(x)!=x || max(y)!=3*pi/4 || anyof(max(x,y)!=[3*pi/4,pi/4])) { goofs++; "**FAILURE** of - min or max function"; } if (sum(x)!=x || not_near(sum(y), 11*pi/12) || avg(x)!=x || not_near(avg(y), 11*pi/24)) { goofs++; "**FAILURE** of - sum or avg function"; } if (allof([1,0]) || !allof([1,1]) || anyof([0,0]) || !anyof([1,0]) || noneof([1,0]) || !noneof([0,0]) || nallof([1,1]) || !nallof([1,0])) { goofs++; "**FAILURE** of - allof, anyof, noneof, or nallof function"; } if (anyof(where([[0,1,0,0],[0,0,0,1]])!=[2,8]) || anyof(where2([[0,1,0,0],[0,0,0,1]])!=[[2,1],[4,2]])) { goofs++; "**FAILURE** of - where or where2 function"; } x= Stest(a='A', b=13, c=[2,-4,6,-8], d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]); y= array(x, 2); y(1).b= 8; y(2).b=19; if (anyof(merge(cA,iS,[1,1,0])!=[1,2,1]) || anyof(merge(lS,sA,[0,0,1])!=[1,2,1]) || anyof(merge(iA,dS,[1,0,1])!=[1,1,2]) || anyof(merge(lA,fA,[[1,1],[0,0]])!=[[1,2],[1,2]]) || anyof(merge(zA,dA,[[1,0],[0,1]])!=[[1,1],[2,2]]) || anyof(merge(cA,cA,[[1,0],[0,1]])!=[[1,1],[2,2]]) || anyof(merge(sA,sA,[[1,0],[0,1]])!=[[1,1],[2,2]]) || anyof(merge(y,x,[1,0,1])!=[y(1),x,y(2)]) || anyof(merge(dA,[],[1,1])!=dA) || anyof(merge([],lA,[0,0])!=lA) || anyof(merge2(lA,zA(::-1),[1,0])!=[1,1])) { goofs++; "**FAILURE** of - merge or merge2 function"; } x= y= []; if (do_stats) "K "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test informational functions..."; /* Test informational functions. */ if (structof(3.5)!=double || structof('\61')!=char || structof([4,5,6])!=long || structof([1n,-1n])!=int || structof([3s,4s])!=short || structof(4.4f)!=float || structof(1i)!=complex || structof(array(Stest,2,2))!=Stest || structof([&[1,2,3],&[],&[3.5,1.2]])!=pointer || structof("yo")!=string) { goofs++; "**FAILURE** of - structof function or structure != operation"; } if (anyof(dimsof([[2,4,6],[1,3,5]])!=[2,3,2]) || anyof(dimsof(5)!=[0]) || anyof(dimsof(array(short,5,-4:-1,3:5,0:1))!=[4,5,4,3,2]) || anyof(dimsof([1,2,3](-,),[1,2])!=[2,2,3])) { goofs++; "**FAILURE** of - dimsof function"; } dummy= use_origins(1); if (anyof(orgsof([[2,4,6],[1,3,5]])!=[2,indgen(0),indgen(0)]) || anyof(orgsof(array(short,5,-4:-1,3:5,0:1))!=[4,indgen(0),-4,3,0])) { goofs++; "**FAILURE** of - orgsof function"; } dummy= []; if (numberof([[2,4,6],[1,3,5]])!=6 || numberof(3.5)!=1 || numberof([])!=0 || numberof(array(short,5,-4:-1,3:5,0:1))!=120) { goofs++; "**FAILURE** of - numberof function"; } if (sizeof([[2,4,6],[1,3,5]])!=6*sizeof(long) || sizeof(3.5)!=sizeof(double) || sizeof(array(short,5,-4:-1,3:5,0:1))!=120*sizeof(short)) { goofs++; "**FAILURE** of - sizeof function"; } if (typeof(3.5)!="double" || typeof('\61')!="char" || typeof([4,5,6])!="long" || typeof([1n,-1n])!="int" || typeof([3s,4s])!="short" || typeof(4.4f)!="float" || typeof(1i)!="complex" || typeof(array(Stest,2,2))!="struct_instance" || typeof(Stest)!="struct_definition" || typeof(3:52:4)!="range" || typeof([])!="void" || typeof()!="void" || typeof("yo")!="string" || typeof(&[3,4])!="pointer") { goofs++; "**FAILURE** of - typeof function"; } if (nameof(Stest)!="Stest" || nameof(not_near)!="not_near") { goofs++; "**FAILURE** of - nameof function"; } if (!is_array([3,4]) || !is_array(0) || is_array() || is_array(not_near) || is_array(Stest)) { goofs++; "**FAILURE** of - is_array function"; } if (is_void(7) || !is_void() || !is_void([]) || is_void(not_near)) { goofs++; "**FAILURE** of - is_void function"; } if (is_func(7) || is_func() || !is_func(not_near) || is_func(Stest)) { goofs++; "**FAILURE** of - is_func function"; } if (is_struct(7) || is_struct() || is_struct(not_near) || !is_struct(Stest)) { goofs++; "**FAILURE** of - is_struct function"; } if (is_range(7) || is_range() || is_range(not_near) || is_range(Stest) || !is_range(3:4)) { goofs++; "**FAILURE** of - is_range function"; } func junk(x) { extern junk_test; return junk_test= am_subroutine(); } junk_test= 0; junk; if (!junk_test || junk()) { goofs++; "**FAILURE** of - am_subroutine function"; } if (do_stats) "L "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test func declarations..."; /* Test func declarations. */ func junk(&w,x,&y,z,..,k=,l=,m=) { rslt= [w,x,y,z,k,l,m]; while (more_args()) grow, rslt, next_arg(); w=x=y=z=k=l=m=16; return rslt; } a= b= c= d= -2; if (anyof(junk(k=5,a,b,m=c,3,4,8,9,l=d,10,11)!=[-2,-2,3,4,5,-2,-2,8,9,10,11]) || a!=16 || b!=-2 || c!=-2 || d!=-2) { goofs++; "**FAILURE** of - complicated func declaration"; } junk= []; /* ------------------------------------------------------------------------- */ write, "Test binary I/O functions..."; /* Test binary I/O functions. */ f= createb("junkb.pdb"); if (is_stream(7) || is_stream() || is_stream(not_near) || is_stream(Stest) || !is_stream(f)) { goofs++; "**FAILURE** of - is_stream function"; } x= ["whoa", "okay"]; y= [&(1+0), &[1.5,2.5,3.5], &[]]; z= Stest(a='A', b=13, c=[2,-4,6,-8], d=[[-1,2],[-3,4],[-5,6]], e=[10,20,30,40,50], f=[1i,2-2i]); save, f, x, y, z; close, f; f= updateb("junkb.pdb"); save, f, iS, lS, dS; save, f, cA, sA, iA, lA, fA, dA, zA; f.sA= [-91,57]; close, f; f= openb("junkb.pdb"); x= y= z= []; restore, f, x, y, z; if (typeof(x)!="string" || typeof(y)!="pointer" || anyof(dimsof(x)!=[1,2]) || anyof(dimsof(y)!=[1,3]) || anyof(x!=["whoa", "okay"]) || typeof(*y(1))!="long" || !is_void(*y(3)) || anyof(*y(2)!=[1.5,2.5,3.5]) || structof(z)!=Stest || z.a!='A' || anyof(dimsof(z.d)!=[2,2,3]) || anyof(dimsof(z.f)!=[1,2]) || anyof(z.f!=[1i,2-2i])) { goofs++; "**FAILURE** of - restore or save function"; } if (f.iS!=iS || f.lS!=lS || f.dS!=dS || anyof(f.cA!=cA) || anyof(f.sA!=[-91,57]) || anyof(f.iA!=iA) || anyof(f.lA!=lA) || anyof(f.fA!=fA) || anyof(f.dA!=dA) || anyof(f.zA!=zA) || typeof(f.cA)!="char" || typeof(f.sA)!="short" || typeof(f.iA)!="int" || typeof(f.lA)!="long" || typeof(f.fA)!="float" || typeof(f.dA)!="double" || typeof(f.zA)!="complex") { goofs++; "**FAILURE** of - f.var syntax or save function"; } close, f; remove, "junkb.pdb"; /* try reading and writing a netCDF file */ write, "Test binary I/O to netCDF..."; require, "netcdf.i"; f= nc_create("junkb.nc"); nc_vardef,f, "lS", template=lS, record=1; nc_vardef,f, "dS", template=dS; nc_vardef,f, "cA", template=cA; nc_vardef,f, "sA", template=sA; nc_vardef,f, "lA", template=lA, record=1; nc_vardef,f, "fA", template=fA; nc_vardef,f, "dA", template=dA, record=1; f= nc_enddef(f); f.dS= dS; f.cA= cA; f.sA= sA; f.fA= fA; nc_addrec, f; save,f, lS,lA,dA; nc_addrec, f; save,f, lS,lA,dA; nc_addrec, f; save,f, lS,lA,dA; close, f; remove, "junkb.ncL"; f= openb("junkb.nc"); if (f.lS!=lS || f.dS!=dS || anyof(f.cA!=cA) || anyof(f.sA!=sA) || anyof(f.lA!=lA) || anyof(f.fA!=fA) || anyof(f.dA!=dA) || typeof(f.cA)!="char" || typeof(f.sA)!="short" || typeof(f.lA)!="long" || typeof(f.fA)!="float" || typeof(f.dA)!="double") { goofs++; "**FAILURE** of - f.var syntax or save to netCDF"; } jr,f, 3; if (f.lS!=lS || anyof(f.lA!=lA) || anyof(f.dA!=dA)) { goofs++; "**FAILURE** of - f.var syntax or save to netCDF"; } close, f; remove, "junkb.nc"; if (do_stats) "M "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test ASCII I/O functions..."; /* Test ASCII I/O functions. */ f= open("junkt.txt", "w"); write,f, "The first line."; write,f, dA; write,f, sA-7, fA+5; write,f, format="blah %s %d %e\n", "wow", lA+6, dA-20; close,f; f= open("junkt.txt", "r+"); if (rdline(f)!=" The first line.") { goofs++; "**FAILURE** of - rdline or write function"; } backup, f; if (rdline(f)!=" The first line.") { goofs++; "**FAILURE** of - backup function"; } mark= bookmark(f); x= 0*dA; if (read(f,x)!=2 || anyof(x!=dA)) { goofs++; "**FAILURE** of - read or write function"; } y= 0*sA; if (read(f,y,x)!=4 || anyof(y!=sA-7) || anyof(x!=fA+5)) { goofs++; "**FAILURE** of - read or write function "; } y= 0*lA; mark2= bookmark(f); if (read(f, format="blah wow %d %e\n", y,x)!=4 || anyof(y!=lA+6) || anyof(x!=dA-20)) { backup, f, mark2; if (read(f, format="blah wow %d %e", y,x)!=4 || anyof(y!=lA+6) || anyof(x!=dA-20)) { goofs++; "**FAILURE** of - formatted read or write function"; } else { /* this OS does not like trailing \n in read formats */ "**WARNING** Yorick formatted read peculiarity -- see testp.i"; } } backup, f, mark; if (read(f,x)!=2 || anyof(x!=dA)) { goofs++; "**FAILURE** of - bookmark or backup function"; } write,f, "Last line."; close, f; f= open("junkt.txt"); if (rdline(f,7)(7)!=" Last line.") { goofs++; "**FAILURE** of - write to append to end of text"; } close, f; remove, "junkt.txt"; if (do_stats) "N "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test string manipulation functions..."; /* Test string manipulation functions. */ if (strlen("abc")!=3 || anyof(strlen([[string(),"","a"],["axx","ab","abcd"]])!= [[0,0,1],[3,2,4]])) { goofs++; "**FAILURE** of - strlen function"; } if (anyof(strtok("abc 1.23 xxx")!=["abc", " 1.23 xxx"]) || anyof(strtok(["abc 1.23 xxx","c","1.5"], "\t c")!= [["ab", " 1.23 xxx"],string(),["1.5",string()]])) { goofs++; "**FAILURE** of - strtok function"; } if (!strmatch("abc", "b") || strmatch("abc", "B") || !strmatch("abc", "B", 1) || anyof(strmatch(["abc","aBC"], "B")!=[0,1])) { goofs++; "**FAILURE** of - strmatch function"; } if (strpart("abc", 1:1)!="a" || strpart("abc", 2:10)!="bc" || strpart("abc", :-1)!="ab" || strpart("abc", :-5)!="" || anyof(strpart(["abc","yowza"],3:)!=["c","wza"])) { goofs++; "**FAILURE** of - strpart function"; } if (do_stats) "O "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test list functions..."; l= _lst(1.5, structof(z), _lst([],z), _prt); #if 0 write, "<Begin output from _prt list (15 lines gibberish)>"; _prt, l; write, "<End output from _prt list (15 lines gibberish)>"; #endif if (_len(l)!=4) { goofs++; "**FAILURE** of - _lst or _len function"; } if (_car(l)!=1.5 || _car(l,1)!=1.5 || _car(l,2)!=Stest || typeof(_car(l,3))!="list" || _car(l,4)!=_prt || !is_void(_car(_car(l,3)))) { goofs++; "**FAILURE** of - _lst or _car function"; } if (_car(_cdr(l))!=Stest || _car(_cdr(l,3))!=_prt || !is_void(_cdr(l,4))) { goofs++; "**FAILURE** of - _cdr function"; } m= _cpy(l,2); if (_len(m)!=2 || _car(m)!=1.5 || _car(m,2)!=Stest || _len(_cpy(l))!=4) { goofs++; "**FAILURE** of - _cpy function"; } if (_car(m,2,2.5)!=Stest || _car(l,2)!=Stest || _car(m,2)!=2.5) { goofs++; "**FAILURE** of - _car set function"; } n= _cat(m, _cpy(_cdr(l,2))); if (n!=m || _len(m)!=4 || _len(n)!=4 || _car(n,4)!=_prt) { goofs++; "**FAILURE** of - _cat function"; } if (_car(_cdr(m,3,[]))!=_prt || !is_void(_cdr(n,3)) || !is_void(_cdr(n,3,_lst(_len))) || _car(m,4)!=_len || _car(l,4)!=_prt) { goofs++; "**FAILURE** of - _cdr set function"; } n= _map(typeof, m); if (_car(n)!="double" || _car(n,2)!="double" || _car(n,3)!="list" || _car(n,4)!="builtin") { goofs++; "**FAILURE** of - _map set function"; } m= _rev(m); if (_car(m,4)!=1.5 || _car(m,3)!=2.5 || typeof(_car(m,2))!="list" || _car(m)!=_len || !is_void(_car(_car(m,2)))) { goofs++; "**FAILURE** of - _rev function"; } l= m= n= []; if (do_stats) "P "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ write, "Test catch function..."; func junk(type) { if (catch(0x01)) { if (type!=0x01) { goofs++; "**FAILURE** of - catch function - misidentified error as math"; } return 0x01; } if (catch(0x02)) { if (type!=0x02) { goofs++; "**FAILURE** of - catch function - misidentified error as io"; } return 0x02; } if (catch(0x04)) { if (type!=0x04) { goofs++; "**FAILURE** of - catch function - misidentified error as C-c"; } return 0x04; } if (catch(0x08)) { if (type!=0x08) { goofs++; "**FAILURE** of - catch function - misidentified error as YError"; } return 0x08; } if (catch(0x10)) { if (type!=0x10) { goofs++; "**FAILURE** of - catch function - misidentified error as interpreted"; } else if (catch_message!="---test error, should be caught---") { goofs++; "**FAILURE** of - catch function - catch_message set incorrectly"; } return 0x10; } if (type==0x01) x= 1.0/0.0; if (type==0x02) f= open("no-such-file-ever-existed"); if (type==0x04) return 0x04; /* need user to hit C-c */ if (type==0x08) x= 1.0*[]; if (type==0x10) error, "---test error, should be caught---"; return 0; } if (!junk(0x01)) "**WARNING** 1.0/0.0 does not trigger SIGFPE"; if (!junk(0x02)) { goofs++; "**FAILURE** of - catch function - I/O error not caught"; } if (!junk(0x08)) { goofs++; "**FAILURE** of - catch function - compiled error not caught"; } if (!junk(0x10)) { goofs++; "**FAILURE** of - catch function - interpreted error not caught"; } junk= []; if (do_stats) "Q "+print(yorick_stats()); /* ------------------------------------------------------------------------- */ iS= lS= dS= cA= sA= iA= lA= fA= dA= zA= []; write, format= "End of Yorick parser test, %d goofs\n", goofs; if (!skip_testb) { require, "testb.i"; write,"\n Zeroth test is pdtest files:"; pdcheck2; write,""; testb; } /* write if tests twice so that include actually takes place */ if (!skip_test1) include, "test1.i"; if (!skip_test1) { write,"\nShock tracker timing test:"; test1, 20; } if (!skip_test2) include, "test2.i"; if (!skip_test2) { write,"\nEscape factor timing test:"; test2, 15; } if (!skip_test3) include, "test3.i"; if (!skip_test3) { write,"\nZone generator timing test:"; test3, 100; } |