home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995 February: Tool Chest / Dev.CD Feb 95 / Dev.CD Feb 95.toast / New System Software Extensions / ASLM SDK v1.1.2 / ASLM Examples / TestTools / Sources / TestMisc.cp < prev    next >
Encoding:
Text File  |  1994-11-21  |  20.1 KB  |  627 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        TestMisc.cp
  3.  
  4.     Contains:    Implementation of class TTestMisc
  5.  
  6.     Copyright:    © 1992-1993 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10. #ifndef __TESTMISC__
  11. #include "TestMisc.h"
  12. #endif
  13. #ifndef __LIBRARYMANAGERCLASSES__
  14. #include <LibraryManagerClasses.h>
  15. #endif
  16. #ifndef __MITEST1__
  17. #include "MITest1.h"
  18. #endif
  19. #ifndef __BACKDEPLIB__
  20. #include "BackDepLib.h"
  21. #endif
  22.  
  23. struct ClientData
  24. {
  25.     int        fData;
  26.     void*    fPointer;
  27. };
  28.  
  29. TTestMisc::TTestMisc()
  30. {}
  31.  
  32. TTestMisc::~TTestMisc()
  33. {}
  34.  
  35. void TTestMisc::InitTest(Boolean, Boolean, int, char**)
  36. {
  37.     ClientData* data = (ClientData*)GetClientData();
  38.     if (data->fData != 0)
  39.         Printf("### ERROR: fData field of ClientData not 0\n");
  40.     if (data->fPointer != 0)
  41.         Printf("### ERROR: fData field of ClientData not 0\n");
  42.     data->fData = 1;
  43.     data->fPointer = this;
  44. }
  45.  
  46. void TTestMisc::EndTest(Boolean, Boolean)
  47. {
  48.     ClientData* data = (ClientData*)GetClientData();
  49.     if (data->fData != 2)
  50.         Printf("### ERROR: fData field of ClientData not 2\n");
  51.     if (data->fPointer != (char*)this + 1)
  52.         Printf("### ERROR: fData field of ClientData not 'this' + 1\n");
  53. }
  54.  
  55. void TTestMisc::RunTestIteration(Boolean verbose, Boolean debug)
  56. {
  57.     //
  58.     // First make sure the backwards dependency libraries load and
  59.     // unload ok.
  60.     //
  61.     Printf("### INFO: Testing backwards dependencies.\n");
  62.     OSErr err = LoadClass(ClassID(kTBackDep1ID),true);
  63.     if (err == kNoError)
  64.         UnloadClass(ClassID(kTBackDep1ID));
  65.     else
  66.         Printf("### ERROR: LoadClass on TBackDep1 class failed.\n");
  67.  
  68.     //
  69.     // Test FindLibrary
  70.     //
  71.     TLibrary* test = LookupLibrary(ClassID("appl:test$TestLibrary"));
  72.     if (test == NULL)
  73.         Printf("### ERROR: LookupLibrary returned NULL\n");
  74.     else
  75.         if (test != GetLocalLibrary())
  76.             Printf("### ERROR: LookupLibrary return %08lX instead of %08lX\n",
  77.                    test, GetLocalLibrary());
  78.                    
  79.     test = LookupLibraryWithClassID(ClassID(kTTestMiscID));
  80.     if (test == NULL)
  81.         Printf("### ERROR: LookupLibraryWithClassID returned NULL\n");
  82.     else
  83.         if (test != GetLocalLibrary())
  84.             Printf("### ERROR: LookupLibraryWithClassID return %08lX instead of %08lX\n",
  85.                    test, GetLocalLibrary());
  86.     //
  87.     // Test GetClientData
  88.     //
  89.     ClientData* data = (ClientData*)GetClientData();
  90.     if (data->fData != 1)
  91.         Printf("### ERROR: fData field of ClientData not 1\n");
  92.     if (data->fPointer != this)
  93.         Printf("### ERROR: fData field of ClientData not 'this'\n");
  94.     data->fData = 2;
  95.     data->fPointer = (char*)this + 1;
  96.     //
  97.     // Test TClassInfo
  98.     //
  99.     {
  100.         if (verbose)
  101.             Printf("### INFO: Testing TClassInfo\n");
  102.         OSErr err;
  103.         TClassInfo* info = GetClassInfo(*(TClassID*)kTTestMiscID, &err);
  104.         if (info == NULL)
  105.         {
  106.             Printf("### ERROR: Got Error #%d for GetClassInfo on ID \"%s\".\n",
  107.                    err, kTTestMiscID);
  108.         }
  109.         else
  110.         {
  111.             TClassID* id = info->GetParentID(1);
  112.             if (id != NULL)
  113.                 Printf("### ERROR: Got ClassID \"%s\" for 2nd parent of \"%s\".\n",
  114.                        id, kTTestMiscID);
  115.             id = info->GetParentID(0);
  116.             if (id == NULL)
  117.                 Printf("### ERROR: Got no ClassID for the parent of \"%s\".\n",
  118.                        kTTestMiscID);
  119.             else
  120.                 if (*id != ClassID(kTTestToolID))
  121.                     Printf("### ERROR: Get ClassID \"%s\" for parent of \"%s\"\n"
  122.                            "           instead of \"%s\".\n",
  123.                            id, kTTestMiscID, kTTestToolID);
  124.         }
  125.         delete info;
  126.     }
  127.  
  128.     //
  129.     // Test TClassInfo on Multiple Inheritance
  130.     //
  131.     {
  132.         if (verbose)
  133.             Printf("### INFO: Testing TClassInfo with multiple inheritance\n");
  134.         OSErr err;
  135.         TClassInfo* info = GetClassInfo(*(TClassID*)kTMixedClassID, &err);
  136.         if (info == NULL)
  137.         {
  138.             Printf("### ERROR: Got Error #%d for GetClassInfo on ID \"%s\".\n",
  139.                    err, kTMixedClassID);
  140.         }
  141.         else
  142.         {
  143.             TClassID* id = info->GetParentID(3);
  144.             if (id != NULL)
  145.                 Printf("### ERROR: Got ClassID \"%s\" for 4th parent of \"%s\".\n",
  146.                        id, kTMixedClassID);
  147.             id = info->GetParentID(0);
  148.             if (id == NULL)
  149.                 Printf("### ERROR: Got no ClassID for the parent of \"%s\".\n",
  150.                        kTStdDynamicID);
  151.             else
  152.                 if (*id != ClassID(kTStdDynamicID))
  153.                     Printf("### ERROR: Get ClassID \"%s\" for parent of \"%s\"\n"
  154.                            "           instead of \"%s\".\n",
  155.                            id, kTMixedClassID, kTStdDynamicID);
  156.             id = info->GetParentID(1);
  157.             if (id == NULL)
  158.                 Printf("### ERROR: Got no ClassID for the 2nd parent of \"%s\".\n",
  159.                        kTMixedClassID);
  160.             else
  161.                 if (*id != ClassID(kMMixin2ID))
  162.                     Printf("### ERROR: Get ClassID \"%s\" for 2nd parent of \"%s\"\n"
  163.                            "           instead of \"%s\".\n",
  164.                            id, kTMixedClassID, kMMixin2ID);
  165.             id = info->GetParentID(2);
  166.             if (id == NULL)
  167.                 Printf("### ERROR: Got no ClassID for the 3rd parent of \"%s\".\n",
  168.                        kTMixedClassID);
  169.             else
  170.                 if (*id != ClassID(kMMixin1ID))
  171.                     Printf("### ERROR: Get ClassID \"%s\" for 3rd parent of \"%s\"\n"
  172.                            "           instead of \"%s\".\n",
  173.                            id, kTMixedClassID, kMMixin1ID);
  174.             info->SetBaseClassID(ClassID(kMMixin1ID));
  175.             Printf("### INFO: Subclasses of MMixin1\n");
  176.             while (id = (TClassID*)info->Next())
  177.             {
  178.                 Printf("###       %s\n", (const char*)id);
  179.             }
  180.  
  181.         }
  182.         delete info;
  183.     }
  184.  
  185.     {
  186.         if (verbose)
  187.             Printf("### INFO: Testing LoadClass on TMixedClass\n");
  188.         if (debug)
  189.             DebugBreak("About to load TMixedClass");
  190.         OSErr err = LoadClass(ClassID(kTMixedClassID), true);
  191.         if (err != kNoError)
  192.             Printf("### ERROR: Error #%d occurred from LoadClass of \"%s\".",
  193.                    err, kTMixedClassID);
  194.         else
  195.         {
  196.             err = UnloadClass(ClassID(kTMixedClassID));
  197.             if (err != kNoError)
  198.                 Printf("### ERROR: Error #%d occurred from UnloadClass of \"%s\".",
  199.                        err, kTMixedClassID);
  200.         }
  201.     }
  202.  
  203.     {
  204.         if (verbose)
  205.             Printf("### INFO: Testing VTables on TMixedClass\n");
  206.         if (debug)
  207.             DebugBreak("About to create a TMixedClass");
  208.         
  209.         TMixedClass foo(5);
  210.         int val;
  211.         //
  212.         // Operates on MMixin1::fieldm if all goes well
  213.         // Should subtract 2 from the 5 already there
  214.         //
  215.         if ((val = (&foo)->Sub1(2)) != 3)
  216.             Printf("### ERROR: TMixedClass::Foo - Expected 3, got %d\n", val);
  217.         //
  218.         // Operates on MMixin1::fieldm if all goes well
  219.         // Should add 4 to the 3 already there
  220.         //
  221.         if ((val = (&foo)->Add1(3)) != 7)
  222.             Printf("### ERROR: TMixedClass::Foo - Expected 7, got %d\n", val);
  223.         //
  224.         // Operates on fieldt if all goes well
  225.         // Should multiply by 20 to the 5 already there
  226.         //
  227.         if ((val = (&foo)->Mul(10)) != 100)
  228.             Printf("### ERROR: TMixedClass::Foo - Expected 100, got %d\n", val);
  229.         //
  230.         // Operates on MMixin2::fieldm if all goes well
  231.         // Should add 8 to the 5 already there
  232.         //
  233.         if ((val = (&foo)->Add2(8)) != 13)
  234.             Printf("### ERROR: TMixedClass::Foo - Expected 13, got %d\n", val);
  235.         //
  236.         // Operates on MMixin2::fieldm if all goes well
  237.         // Should subtract 5 from the 13 already there
  238.         //
  239.         if ((val = (&foo)->Sub2(3)) != 8)
  240.             Printf("### ERROR: TMixedClass::Foo - Expected 8, got %d\n", val);
  241.         //
  242.         // Operates on fieldt if all goes well
  243.         // Should divide by 5 to the 100 already there
  244.         //
  245.         if ((val = (&foo)->Div(5)) != 20)
  246.             Printf("### ERROR: TMixedClass::Foo - Expected 20, got %d\n", val);
  247.             
  248.         if (verbose)
  249.             Printf("### INFO: Testing CastObject on TMixedClass\n");
  250.  
  251.         TStdDynamic* sdyn = (TStdDynamic*)CastObject(&foo, ClassID(kTStdDynamicID));
  252.         if (sdyn == NULL)
  253.             Printf("### ERROR: CastObject to TStdDynamic returned NULL\n");
  254.         else
  255.             if (sdyn != (TStdDynamic*)&foo)
  256.                 Printf("### ERROR: CastObject to TStdDynamic return wrong value\n");
  257.         
  258.         MMixin1* mixin1 = (MMixin1*)CastObject(&foo, ClassID(kMMixin1ID));
  259.         if (mixin1 == NULL)
  260.             Printf("### ERROR: CastObject to MMixin1 returned NULL\n");
  261.         else
  262.             if (mixin1 != (MMixin1*)&foo)
  263.                 Printf("### ERROR: CastObject to MMixin1 return wrong value\n");
  264.     
  265.         MMixin2* mixin2 = (MMixin2*)CastObject(&foo, ClassID(kMMixin2ID));
  266.         if (mixin2 == NULL)
  267.             Printf("### ERROR: CastObject to MMixin2 returned NULL\n");
  268.         else
  269.             if (mixin2 != (MMixin2*)&foo)
  270.                 Printf("### ERROR: CastObject to MMixin2 return wrong value\n");
  271.  
  272.         if (sdyn)
  273.         {
  274.             TMixedClass* mix1 = (TMixedClass*)CastObject(sdyn, ClassID(kTMixedClassID));
  275.             if (sdyn == NULL)
  276.                 Printf("### ERROR: CastObject to TMixedClass from TStdDynamic returned NULL\n");
  277.             else
  278.                 if (mix1 != &foo)
  279.                     Printf("### ERROR: CastObject to TMixedClass from TStdDynamic return wrong value\n");
  280.             MMixin1* mixin1 = (MMixin1*)CastObject(sdyn, ClassID(kMMixin1ID));
  281.             if (mixin1 == NULL)
  282.                 Printf("### ERROR: CastObject to MMixin1 from TStdDynamic returned NULL\n");
  283.             else
  284.                 if (mixin1 != (MMixin1*)&foo)
  285.                     Printf("### ERROR: CastObject to MMixin1 from TStdDynamic return wrong value\n");
  286.         
  287.             MMixin2* mixin2 = (MMixin2*)CastObject(sdyn, ClassID(kMMixin2ID));
  288.             if (mixin2 == NULL)
  289.                 Printf("### ERROR: CastObject to MMixin2 from TStdDynamic returned NULL\n");
  290.             else
  291.                 if (mixin2 != (MMixin2*)&foo)
  292.                     Printf("### ERROR: CastObject to MMixin2 from TStdDynamic return wrong value\n");
  293.         }
  294.         
  295.         if (mixin1)
  296.         {
  297.             TMixedClass* mix1 = (TMixedClass*)CastObject(mixin1, ClassID(kTMixedClassID));
  298.             if (mix1 == NULL)
  299.                 Printf("### ERROR: CastObject to TMixedClass from MMixin1 returned NULL\n");
  300.             else
  301.                 if (mix1 != &foo)
  302.                     Printf("### ERROR: CastObject to TMixedClass from MMixin1 return wrong value\n");
  303.         }
  304.  
  305.         if (mixin2)
  306.         {
  307.             TMixedClass* mix2 = (TMixedClass*)CastObject(mixin2, ClassID(kTMixedClassID));
  308.             if (mix2 == NULL)
  309.                 Printf("### ERROR: CastObject to TMixedClass from MMixin2 returned NULL\n");
  310.             else
  311.                 if (mix2 != &foo)
  312.                     Printf("### ERROR: CastObject to TMixedClass from MMixin2 return wrong value\n");
  313.         }
  314.     }
  315.     {
  316.         if (verbose)
  317.             Printf("### INFO: Testing Stubs for TMixedClass\n");
  318.         if (debug)
  319.             DebugBreak("About to test TMixedClass stubs");
  320.         
  321.         TMixedClass foo(5);
  322.         int val;
  323.         //
  324.         // Operates on MMixin1::fieldm if all goes well
  325.         // Should subtract 2 from the 5 already there
  326.         //
  327.         if ((val = foo.Sub1(2)) != 3)
  328.             Printf("### ERROR: TMixedClass::Foo - Expected 3, got %d\n", val);
  329.         //
  330.         // Operates on MMixin1::fieldm if all goes well
  331.         // Should add 4 to the 3 already there
  332.         //
  333.         if ((val = foo.Add1(3)) != 7)
  334.             Printf("### ERROR: TMixedClass::Foo - Expected 7, got %d\n", val);
  335.         //
  336.         // Operates on fieldt if all goes well
  337.         // Should multiply by 20 to the 5 already there
  338.         //
  339.         if ((val = foo.Mul(10)) != 100)
  340.             Printf("### ERROR: TMixedClass::Foo - Expected 100, got %d\n", val);
  341.         //
  342.         // Operates on MMixin2::fieldm if all goes well
  343.         // Should add 8 to the 5 already there
  344.         //
  345.         if ((val = foo.Add2(8)) != 13)
  346.             Printf("### ERROR: TMixedClass::Foo - Expected 13, got %d\n", val);
  347.         //
  348.         // Operates on MMixin2::fieldm if all goes well
  349.         // Should subtract 5 from the 13 already there
  350.         //
  351.         if ((val = foo.Sub2(3)) != 8)
  352.             Printf("### ERROR: TMixedClass::Foo - Expected 8, got %d\n", val);
  353.         //
  354.         // Operates on fieldt if all goes well
  355.         // Should divide by 5 to the 100 already there
  356.         //
  357.         if ((val = foo.Div(5)) != 20)
  358.             Printf("### ERROR: TMixedClass::Foo - Expected 20, got %d\n", val);
  359.             
  360.     }
  361.     {
  362.         if (verbose)
  363.             Printf("### INFO: Testing VTables on TMixedClass2\n");
  364.         if (debug)
  365.             DebugBreak("About to create a TMixedClass2");
  366.         
  367.         TMixedClass2 foo(5);
  368.         int val;
  369.         //
  370.         // Operates on MMixin1::fieldm if all goes well
  371.         // Should subtract 2 from the 5 already there
  372.         //
  373.         if ((val = (&foo)->Sub1(2)) != 3)
  374.             Printf("### ERROR: TMixedClass2::Foo - Expected 3, got %d\n", val);
  375.         //
  376.         // Operates on MMixin1::fieldm if all goes well
  377.         // Should add 3 to the 3 already there
  378.         //
  379.         if ((val = (&foo)->Add1(3)) != 6)
  380.             Printf("### ERROR: TMixedClass2::Foo - Expected 6, got %d\n", val);
  381.         //
  382.         // Operates on fieldt if all goes well
  383.         // Should multiply by 10 to the 5 already there
  384.         //
  385.         if ((val = (&foo)->Mul(10)) != 50)
  386.             Printf("### ERROR: TMixedClass2::Foo - Expected 50, got %d\n", val);
  387.         //
  388.         // Operates on MMixin2::fieldm if all goes well
  389.         // Should add 8 to the 5 already there
  390.         //
  391.         if ((val = (&foo)->Add2(8)) != 13)
  392.             Printf("### ERROR: TMixedClass2::Foo - Expected 13, got %d\n", val);
  393.         //
  394.         // Operates on MMixin2::fieldm if all goes well
  395.         // Should subtract 3 from the 13 already there
  396.         //
  397.         if ((val = (&foo)->Sub2(3)) != 10)
  398.             Printf("### ERROR: TMixedClass2::Foo - Expected 10, got %d\n", val);
  399.         //
  400.         // Operates on fieldt if all goes well
  401.         // Should divide by 5 to the 50 already there
  402.         //
  403.         if ((val = (&foo)->Div(5)) != 10)
  404.             Printf("### ERROR: TMixedClass::Foo - Expected 10, got %d\n", val);
  405.         //
  406.         // Operates on MMixin3::fieldm if all goes well
  407.         // Should Add 10 to the 5 already there
  408.         //
  409.         if ((val = (&foo)->Add3(10)) != 15)
  410.             Printf("### ERROR: TMixedClass2::Foo - Expected 15, got %d\n", val);
  411.         //
  412.         // Operates on MMixin3::fieldm if all goes well
  413.         // Should subtract 11 from the 15 already there
  414.         //
  415.         if ((val = (&foo)->Sub3(8)) != 4)
  416.             Printf("### ERROR: TMixedClass::Foo - Expected 4, got %d\n", val);
  417.             
  418.         if (verbose)
  419.             Printf("### INFO: Testing CastObject on TMixedClass2\n");
  420.  
  421.         TMixedClass* mixed = (TMixedClass*)CastObject(&foo, ClassID(kTMixedClassID));
  422.         if (mixed == NULL)
  423.             Printf("### ERROR: CastObject to TMixedClass returned NULL\n");
  424.         else
  425.             if (mixed != (TMixedClass*)&foo)
  426.                 Printf("### ERROR: CastObject to TMixedClass return wrong value\n");
  427.  
  428.         TStdDynamic* sdyn = (TStdDynamic*)CastObject(&foo, ClassID(kTStdDynamicID));
  429.         if (sdyn == NULL)
  430.             Printf("### ERROR: CastObject to TStdDynamic returned NULL\n");
  431.         else
  432.             if (sdyn != (TStdDynamic*)&foo)
  433.                 Printf("### ERROR: CastObject to TStdDynamic return wrong value\n");
  434.             else
  435.                 Printf("### INFO: TStdDynamic value was %08lX\n", sdyn);
  436.  
  437.         MMixin1* mixin1 = (MMixin1*)CastObject(&foo, ClassID(kMMixin1ID));
  438.         if (mixin1 == NULL)
  439.             Printf("### ERROR: CastObject to MMixin1 returned NULL\n");
  440.         else
  441.             if (mixin1 != (MMixin1*)&foo)
  442.                 Printf("### ERROR: CastObject to MMixin1 return wrong value\n");
  443.             else
  444.                 Printf("### INFO: MMixin1 value was %08lX\n", mixin1);
  445.  
  446.         MMixin2* mixin2 = (MMixin2*)CastObject(&foo, ClassID(kMMixin2ID));
  447.         if (mixin2 == NULL)
  448.             Printf("### ERROR: CastObject to MMixin2 returned NULL\n");
  449.         else
  450.             if (mixin2 != (MMixin2*)&foo)
  451.                 Printf("### ERROR: CastObject to MMixin2 return wrong value\n");
  452.             else
  453.                 Printf("### INFO: MMixin2 value was %08lX\n", mixin2);
  454.  
  455.         MMixin3* mixin3 = (MMixin3*)CastObject(&foo, ClassID(kMMixin3ID));
  456.         if (mixin3 == NULL)
  457.             Printf("### ERROR: CastObject to MMixin3 returned NULL\n");
  458.         else
  459.             if (mixin3 != (MMixin3*)&foo)
  460.                 Printf("### ERROR: CastObject to MMixin3 return wrong value\n");
  461.             else
  462.                 Printf("### INFO: MMixin3 value was %08lX\n", mixin3);
  463.  
  464.         if (sdyn)
  465.         {
  466.             TMixedClass2* mix1 = (TMixedClass2*)CastObject(sdyn, ClassID(kTMixedClass2ID));
  467.             if (mix1 == NULL)
  468.                 Printf("### ERROR: CastObject to TMixedClass from TStdDynamic returned NULL\n");
  469.             else
  470.                 if (mix1 != &foo)
  471.                     Printf("### ERROR: CastObject to TMixedClass from TStdDynamic return wrong value\n");
  472.             MMixin1* mmix1 = (MMixin1*)CastObject(sdyn, ClassID(kMMixin1ID));
  473.             if (mmix1 == NULL)
  474.                 Printf("### ERROR: CastObject to MMixin1 from TStdDynamic returned NULL\n");
  475.             else
  476.                 if (mmix1 != (MMixin1*)&foo)
  477.                     Printf("### ERROR: CastObject to MMixin1 from TStdDynamic return %08lX instead of %08lX\n",
  478.                            mmix1, (MMixin1*)&foo);
  479.             MMixin2* mmix2 = (MMixin2*)CastObject(sdyn, ClassID(kMMixin2ID));
  480.             if (mmix2 == NULL)
  481.                 Printf("### ERROR: CastObject to MMixin2 from MMixin1 returned NULL\n");
  482.             else
  483.                 if (mmix2 != (MMixin2*)&foo)
  484.                     Printf("### ERROR: CastObject to MMixin2 from MMixin1 return %08lX instead of %08lX\n",
  485.                            mmix2, (MMixin2*)&foo);
  486.             MMixin3* mmix3 = (MMixin3*)CastObject(sdyn, ClassID(kMMixin3ID));
  487.             if (mmix3 == NULL)
  488.                 Printf("### ERROR: CastObject to MMixin3 from TStdDynamic returned NULL\n");
  489.             else
  490.                 if (mmix3 != (MMixin3*)&foo)
  491.                     Printf("### ERROR: CastObject to MMixin3 from TStdDynamic return %08lX instead of %08lX\n",
  492.                            mmix3, (MMixin3*)&foo);
  493.         }
  494.         if (mixin1)
  495.         {
  496.             TMixedClass2* mix1 = (TMixedClass2*)CastObject(mixin1, ClassID(kTMixedClass2ID));
  497.             if (mix1 == NULL)
  498.                 Printf("### ERROR: CastObject to TMixedClass from MMixin1 returned NULL\n");
  499.             else
  500.                 if (mix1 != &foo)
  501.                     Printf("### ERROR: CastObject to TMixedClass from MMixin1 return wrong value\n");
  502.             MMixin2* mmix2 = (MMixin2*)CastObject(mixin1, ClassID(kMMixin2ID));
  503.             if (mmix2 == NULL)
  504.                 Printf("### ERROR: CastObject to MMixin2 from MMixin1 returned NULL\n");
  505.             else
  506.                 if (mmix2 != (MMixin2*)&foo)
  507.                     Printf("### ERROR: CastObject to MMixin2 from MMixin1 return %08lX instead of %08lX\n",
  508.                            mmix2, (MMixin2*)&foo);
  509.             MMixin3* mmix3 = (MMixin3*)CastObject(mixin1, ClassID(kMMixin3ID));
  510.             if (mmix3 == NULL)
  511.                 Printf("### ERROR: CastObject to MMixin3 from MMixin1 returned NULL\n");
  512.             else
  513.                 if (mmix3 != (MMixin3*)&foo)
  514.                     Printf("### ERROR: CastObject to MMixin3 from MMixin1 return %08lX instead of %08lX\n",
  515.                            mmix3, (MMixin3*)&foo);
  516.         }
  517.  
  518.         if (mixin2)
  519.         {
  520.             TMixedClass2* mix2 = (TMixedClass2*)CastObject(mixin2, ClassID(kTMixedClass2ID));
  521.             if (mix2 == NULL)
  522.                 Printf("### ERROR: CastObject to TMixedClass from MMixin2 returned NULL\n");
  523.             else
  524.                 if (mix2 != &foo)
  525.                     Printf("### ERROR: CastObject to TMixedClass from MMixin2 return wrong value\n");
  526.  
  527.             MMixin1* mmix1 = (MMixin1*)CastObject(mixin2, ClassID(kMMixin1ID));
  528.             if (mmix1 == NULL)
  529.                 Printf("### ERROR: CastObject to MMixin1 from MMixin2 returned NULL\n");
  530.             else
  531.                 if (mmix1 != (MMixin1*)&foo)
  532.                     Printf("### ERROR: CastObject to MMixin1 from MMixin2 return %08lX instead of %08lX\n",
  533.                            mmix1, (MMixin1*)&foo);
  534.  
  535.             MMixin3* mmix3 = (MMixin3*)CastObject(mixin2, ClassID(kMMixin3ID));
  536.             if (mmix3 == NULL)
  537.                 Printf("### ERROR: CastObject to MMixin3 from MMixin2 returned NULL\n");
  538.             else
  539.                 if (mmix3 != (MMixin3*)&foo)
  540.                     Printf("### ERROR: CastObject to MMixin3 from MMixin2 return %08lX instead of %08lX\n",
  541.                            mmix3, (MMixin3*)&foo);
  542.         }
  543.         if (mixin3)
  544.         {
  545.             TMixedClass2* mix3 = (TMixedClass2*)CastObject(mixin3, ClassID(kTMixedClass2ID));
  546.             if (mix3 == NULL)
  547.                 Printf("### ERROR: CastObject to TMixedClass from MMixin3 returned NULL\n");
  548.             else
  549.                 if (mix3 != &foo)
  550.                     Printf("### ERROR: CastObject to TMixedClass from MMixin3 return wrong value\n");
  551.  
  552.             MMixin1* mmix1 = (MMixin1*)CastObject(mixin3, ClassID(kMMixin1ID));
  553.             if (mmix1 == NULL)
  554.                 Printf("### ERROR: CastObject to MMixin1 from MMixin3 returned NULL\n");
  555.             else
  556.                 if (mmix1 != (MMixin1*)&foo)
  557.                     Printf("### ERROR: CastObject to MMixin1 from MMixin3 return %08lX instead of %08lX\n",
  558.                            mmix1, (MMixin1*)&foo);
  559.  
  560.             MMixin2* mmix2 = (MMixin2*)CastObject(mixin3, ClassID(kMMixin2ID));
  561.             if (mmix2 == NULL)
  562.                 Printf("### ERROR: CastObject to MMixin2 from MMixin3 returned NULL\n");
  563.             else
  564.                 if (mmix2 != (MMixin2*)&foo)
  565.                     Printf("### ERROR: CastObject to MMixin2 from MMixin3 return %08lX instead of %08lX\n",
  566.                            mmix2, (MMixin2*)&foo);
  567.         }
  568.     }
  569.     {
  570.         if (verbose)
  571.             Printf("### INFO: Testing Stubs on TMixedClass2\n");
  572.         if (debug)
  573.             DebugBreak("About to create a TMixedClass2");
  574.         
  575.         TMixedClass2 foo(5);
  576.         int val;
  577.         //
  578.         // Operates on MMixin1::fieldm if all goes well
  579.         // Should subtract 2 from the 5 already there
  580.         //
  581.         if ((val = foo.Sub1(2)) != 3)
  582.             Printf("### ERROR: TMixedClass2::Foo - Expected 3, got %d\n", val);
  583.         //
  584.         // Operates on MMixin1::fieldm if all goes well
  585.         // Should add 3 to the 3 already there
  586.         //
  587.         if ((val = foo.Add1(3)) != 6)
  588.             Printf("### ERROR: TMixedClass2::Foo - Expected 6, got %d\n", val);
  589.         //
  590.         // Operates on fieldt if all goes well
  591.         // Should multiply by 10 to the 5 already there
  592.         //
  593.         if ((val = foo.Mul(10)) != 50)
  594.             Printf("### ERROR: TMixedClass2::Foo - Expected 50, got %d\n", val);
  595.         //
  596.         // Operates on MMixin2::fieldm if all goes well
  597.         // Should add 8 to the 5 already there
  598.         //
  599.         if ((val = foo.Add2(8)) != 13)
  600.             Printf("### ERROR: TMixedClass2::Foo - Expected 13, got %d\n", val);
  601.         //
  602.         // Operates on MMixin2::fieldm if all goes well
  603.         // Should subtract 3 from the 13 already there
  604.         //
  605.         if ((val = foo.Sub2(3)) != 10)
  606.             Printf("### ERROR: TMixedClass2::Foo - Expected 10, got %d\n", val);
  607.         //
  608.         // Operates on fieldt if all goes well
  609.         // Should divide by 5 to the 50 already there
  610.         //
  611.         if ((val = foo.Div(5)) != 10)
  612.             Printf("### ERROR: TMixedClass::Foo - Expected 10, got %d\n", val);
  613.         //
  614.         // Operates on MMixin3::fieldm if all goes well
  615.         // Should Add 10 to the 5 already there
  616.         //
  617.         if ((val = foo.Add3(10)) != 15)
  618.             Printf("### ERROR: TMixedClass2::Foo - Expected 15, got %d\n", val);
  619.         //
  620.         // Operates on MMixin3::fieldm if all goes well
  621.         // Should subtract 11 from the 15 already there
  622.         //
  623.         if ((val = foo.Sub3(8)) != 4)
  624.             Printf("### ERROR: TMixedClass::Foo - Expected 4, got %d\n", val);
  625.     }            
  626. }
  627.