Smart Records
This page contains testing results for Maciej's smart record management operators. The compiler for the following tests were build from this svn source:
svn co -r 33384 http://svn.freepascal.org/svn/fpc/branches/maciej/smart_pointers
user@linux:~/Development/Pascal/tests$ ./smart Global pre-initialize: passed Global initializing: passed Stack initialize test: passed Nested test: passed Nested finalized: passed Sub local exit test: passed Array length test: passed Array test: passed Tests finalized: passed Balance: 1 Total tests failed: 0 Total tests passed: 9
Compilation yielded the following messages:
user@linux:~/Development/Pascal/tests$ fpc smart.pas Free Pascal Compiler version 3.1.1 [2016/03/30] for x86_64 Copyright (c) 1993-2015 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling smart.pas smart.pas(49,24) Warning: Local variable "Foo" of a managed type does not seem to be initialized smart.pas(64,33) Warning: Local variable "Foo" of a managed type does not seem to be initialized smart.pas(76,31) Warning: Variable "Foo" of a managed type does not seem to be initialized Linking smart 83 lines compiled, 0.1 sec 3 warning(s) issued
This is the test source code.
program smart;
{$mode delphi}
var
FailCount: Integer;
PassCount: Integer;
Balance: Integer;
Created: Boolean;
procedure Check(const Message: string; Valid: Boolean);
const
Passed: array[Boolean] of string = (': failed', ': passed');
begin
WriteLn(Message, Passed[Valid]);
if Valid then Inc(PassCount) else Inc(FailCount);
end;
type
TFoo = record
private
class operator Initialize(var Foo: TFoo);
class operator Finalize(var Foo: TFoo);
public
IntValue: Integer;
end;
TFooArray = array of TFoo;
class operator TFoo.Initialize(var Foo: TFoo);
begin
Inc(Balance);
Foo.IntValue := Balance;
Created := True;
end;
class operator TFoo.Finalize(var Foo: TFoo);
begin
Dec(Balance);
Created := False;
end;
procedure Tests;
procedure NestedTest;
var
Foo: TFoo;
begin
Check('Nested test', Foo.IntValue = 3);
end;
procedure ArrayTest;
var
Foos: TFooArray;
begin
SetLength(Foos, 5);
Check('Array length test', Balance = 7);
Check('Array test', Foos[0].IntValue = 3);
end;
var
Foo: TFoo;
begin
Check('Stack initialize test', Foo.IntValue = 2);
NestedTest;
Check('Nested finalized', not Created);
Check('Sub local exit test', Balance = 2);
Created := True;
ArrayTest;
end;
var
Foo: TFoo;
begin
Check('Global pre-initialize', Created);
Check('Global initializing', Foo.IntValue = 1);
Tests;
Check('Tests finalized', not Created);
WriteLn;
WriteLn('Balance: ', Balance);
WriteLn('Total tests failed: ', FailCount);
WriteLn('Total tests passed: ', PassCount);
end.