{$MODE OBJFPC} { -*- delphi -*- } {$INCLUDE settings.inc} program test_autostorable; uses storable, autostorable; type TRoot = class(TStorable) end; TSubA = class(TRoot) end; TSubB = class(TRoot) end; TRootClass = class of TRoot; TCallback = procedure of object; TTest = class(TAutoStorable) public FNumber: Integer; FNumberFloat: Double; FNested: TTest; FClassOfTest: TRootClass; FCallback: TCallback; published procedure TestCallback(); property Number: Integer read FNumber write FNumber; property NumberFloat: Double read FNumberFloat write FNumberFloat; property Nested: TTest read FNested write FNested; property ClassOfTest: TRootClass read FClassOfTest write FClassOfTest; property MethodTest: TCallback read FCallback write FCallback; end; var TestCallbackCounter: Cardinal = 0; procedure TTest.TestCallback(); begin Inc(TestCallbackCounter); end; var TestNumber: Cardinal = 0; procedure Test(const Expression: Boolean); begin Inc(TestNumber); if (not Expression) then begin Writeln('Failed test ', TestNumber , '.'); Assert(False); Halt(1); end; end; var TestA, TestB: TTest; begin RegisterStorableClass(TTest); RegisterStorableClass(TRoot); RegisterStorableClass(TSubA); RegisterStorableClass(TSubB); TestA := TTest.Create(); TestA.Number := -10; TestA.NumberFloat := 1.2e9; TestB := TTest.Create(); TestB.Number := 1; TestB.NumberFloat := 1.0; TestA.Nested := TestB; TestA.ClassOfTest := TSubB; TestA.MethodTest := @TestA.TestCallback; StoreObjectToFile('tests/test_autostorable.$$$', TestA, 1); Test(TestA.Number = -10); Test(TestA.NumberFloat = 1.2e9); Test(TestCallbackCounter = 0); TestA.MethodTest(); Test(TestCallbackCounter = 1); TestA.Free(); TestB.Free(); TestA := ReadObjectFromFile('tests/test_autostorable.$$$') as TTest; Test(TestA.Number = -10); Test(TestA.NumberFloat = 1.2e9); Test(TestA.Nested.Number = 1); Test(TestA.Nested.NumberFloat = 1.0); Test(TestA.ClassOfTest = TSubB); TestA.MethodTest(); Test(TestCallbackCounter = 2); TestA.Nested.Free(); TestA.Free(); // XXX should test that references get correctly round-tripped // XXX should test that 'nil' class values get correctly round-tripped end.