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.