From 1d72397c19bbdbba9c194b50636bc3984fe9c1d0 Mon Sep 17 00:00:00 2001 From: svenbarth Date: Sat, 21 Nov 2015 16:53:11 +0000 Subject: [PATCH] Add tests for generic functions/procedures/methods git-svn-id: trunk@32440 - --- .gitattributes | 16 +++++++++ tests/test/tgenfunc1.pp | 17 +++++++++ tests/test/tgenfunc10.pp | 50 +++++++++++++++++++++++++++ tests/test/tgenfunc11.pp | 18 ++++++++++ tests/test/tgenfunc12.pp | 26 ++++++++++++++ tests/test/tgenfunc13.pp | 21 ++++++++++++ tests/test/tgenfunc14.pp | 21 ++++++++++++ tests/test/tgenfunc15.pp | 45 ++++++++++++++++++++++++ tests/test/tgenfunc2.pp | 17 +++++++++ tests/test/tgenfunc3.pp | 22 ++++++++++++ tests/test/tgenfunc4.pp | 22 ++++++++++++ tests/test/tgenfunc5.pp | 24 +++++++++++++ tests/test/tgenfunc6.pp | 24 +++++++++++++ tests/test/tgenfunc7.pp | 26 ++++++++++++++ tests/test/tgenfunc8.pp | 42 +++++++++++++++++++++++ tests/test/tgenfunc9.pp | 14 ++++++++ tests/test/ugenfunc7.pp | 74 ++++++++++++++++++++++++++++++++++++++++ 17 files changed, 479 insertions(+) create mode 100644 tests/test/tgenfunc1.pp create mode 100644 tests/test/tgenfunc10.pp create mode 100644 tests/test/tgenfunc11.pp create mode 100644 tests/test/tgenfunc12.pp create mode 100644 tests/test/tgenfunc13.pp create mode 100644 tests/test/tgenfunc14.pp create mode 100644 tests/test/tgenfunc15.pp create mode 100644 tests/test/tgenfunc2.pp create mode 100644 tests/test/tgenfunc3.pp create mode 100644 tests/test/tgenfunc4.pp create mode 100644 tests/test/tgenfunc5.pp create mode 100644 tests/test/tgenfunc6.pp create mode 100644 tests/test/tgenfunc7.pp create mode 100644 tests/test/tgenfunc8.pp create mode 100644 tests/test/tgenfunc9.pp create mode 100644 tests/test/ugenfunc7.pp diff --git a/.gitattributes b/.gitattributes index 42db581108..75b3309cc2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12242,6 +12242,21 @@ tests/test/tgeneric96.pp svneol=native#text/pascal tests/test/tgeneric97.pp svneol=native#text/pascal tests/test/tgeneric98.pp svneol=native#text/pascal tests/test/tgeneric99.pp svneol=native#text/pascal +tests/test/tgenfunc1.pp svneol=native#text/pascal +tests/test/tgenfunc10.pp svneol=native#text/pascal +tests/test/tgenfunc11.pp svneol=native#text/pascal +tests/test/tgenfunc12.pp svneol=native#text/pascal +tests/test/tgenfunc13.pp svneol=native#text/pascal +tests/test/tgenfunc14.pp svneol=native#text/pascal +tests/test/tgenfunc15.pp svneol=native#text/pascal +tests/test/tgenfunc2.pp svneol=native#text/pascal +tests/test/tgenfunc3.pp svneol=native#text/pascal +tests/test/tgenfunc4.pp svneol=native#text/pascal +tests/test/tgenfunc5.pp svneol=native#text/pascal +tests/test/tgenfunc6.pp svneol=native#text/pascal +tests/test/tgenfunc7.pp svneol=native#text/pascal +tests/test/tgenfunc8.pp svneol=native#text/pascal +tests/test/tgenfunc9.pp svneol=native#text/pascal tests/test/tgoto.pp svneol=native#text/plain tests/test/theap.pp svneol=native#text/plain tests/test/theapthread.pp svneol=native#text/plain @@ -12896,6 +12911,7 @@ tests/test/ugeneric96b.pp svneol=native#text/pascal tests/test/ugeneric96c.pp svneol=native#text/pascal tests/test/ugeneric96d.pp svneol=native#text/pascal tests/test/ugeneric99.pp svneol=native#text/pascal +tests/test/ugenfunc7.pp svneol=native#text/pascal tests/test/uhintdir.pp svneol=native#text/plain tests/test/uhlp3.pp svneol=native#text/pascal tests/test/uhlp31.pp svneol=native#text/pascal diff --git a/tests/test/tgenfunc1.pp b/tests/test/tgenfunc1.pp new file mode 100644 index 0000000000..cdd9d339f8 --- /dev/null +++ b/tests/test/tgenfunc1.pp @@ -0,0 +1,17 @@ +{ test syntax of a global generic function in mode objfpc } + +program tgenfunc1; + +{$mode objfpc} + +generic function Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +begin + if specialize Add(2, 3) <> 5 then + Halt(1); + if specialize Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc10.pp b/tests/test/tgenfunc10.pp new file mode 100644 index 0000000000..a2287fe95e --- /dev/null +++ b/tests/test/tgenfunc10.pp @@ -0,0 +1,50 @@ +{ %NORUN } + +{ ensure that specializations with local types are handled correctly } + +program tgenfunc10; + +{$mode objfpc} + +operator := (aOther: LongInt): String; +begin + Str(aOther, Result); +end; + +generic function Test(aArg: T): String; +begin + Result := aArg.Test; +end; + +procedure Test1; +type + TTest = record + Test: LongInt; + end; + +var + s: String; + t: TTest; +begin + t.Test := 42; + s := specialize Test(t); +end; + +procedure Test2; +type + TTest = record + Test: String; + end; + +var + s: String; + t: TTest; +begin + t.Test := 'Hello World'; + s := specialize Test(t); +end; + +begin + Test1; + Test2; +end. diff --git a/tests/test/tgenfunc11.pp b/tests/test/tgenfunc11.pp new file mode 100644 index 0000000000..3dcb35a594 --- /dev/null +++ b/tests/test/tgenfunc11.pp @@ -0,0 +1,18 @@ +{ %FAIL } + +program tgenfunc11; + +{$mode objfpc} + +type + TTest = class + generic procedure Test; virtual; + end; + +generic procedure TTest.Test; +begin +end; + +begin + +end. diff --git a/tests/test/tgenfunc12.pp b/tests/test/tgenfunc12.pp new file mode 100644 index 0000000000..d2f488fb30 --- /dev/null +++ b/tests/test/tgenfunc12.pp @@ -0,0 +1,26 @@ +program tgenfunc12; + +{$mode objfpc} + +type + TTest = class + generic function Test: T; + end; + +generic function TTest.Test: T; +begin + Result := T.Create; +end; + +generic function Test: T; +begin + Result := TInterfacedObject.Create; +end; + +var + t: TTest; +begin + t := TTest.Create; + t.specialize Test.Free; + specialize Test; +end. diff --git a/tests/test/tgenfunc13.pp b/tests/test/tgenfunc13.pp new file mode 100644 index 0000000000..a872d34424 --- /dev/null +++ b/tests/test/tgenfunc13.pp @@ -0,0 +1,21 @@ +{ %FAIL } + +{ constraints must not be repeated in the definition } + +program tgenfunc13; + +{$mode objfpc} + +type + TTest = class + generic procedure Test; + end; + +generic procedure TTest.Test; +begin + +end; + +begin + +end. diff --git a/tests/test/tgenfunc14.pp b/tests/test/tgenfunc14.pp new file mode 100644 index 0000000000..29acc9aed6 --- /dev/null +++ b/tests/test/tgenfunc14.pp @@ -0,0 +1,21 @@ +{ %FAIL } + +unit tgenfunc14; + +{$mode objfpc} + +{ constraints must not be repeated in the definition } + +interface + +generic procedure Test; + +implementation + +generic procedure Test; +begin + +end; + +end. + diff --git a/tests/test/tgenfunc15.pp b/tests/test/tgenfunc15.pp new file mode 100644 index 0000000000..6922a43326 --- /dev/null +++ b/tests/test/tgenfunc15.pp @@ -0,0 +1,45 @@ +{ correct match functions with array parameters of the generic type } + +unit tgenfunc15; + +{$mode objfpc}{$H+} + +interface + +type + generic TStaticArray = array[0..4] of T; + + TTest = class + generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray); + generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray; aArg4: LongInt); + end; + +generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray); +generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray; aArg4: LongInt); + +implementation + +generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray); +begin +end; + +generic procedure Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray; aArg4: LongInt); +begin +end; + +generic procedure TTest.Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray); +begin +end; + +generic procedure TTest.Test(aArg1: T; aArg2: array of T; aArg3: specialize TStaticArray; aArg4: LongInt); +begin +end; + +var + t: array[0..4] of LongInt = (0, 1, 2, 3, 4); + s: array[0..4] of String = ('abc', 'def', 'ghi', 'jkl', 'mno'); +initialization + specialize Test(42, [32, 43], t); + specialize Test('FPC', ['Hello', 'World'], s, 42); +end. + diff --git a/tests/test/tgenfunc2.pp b/tests/test/tgenfunc2.pp new file mode 100644 index 0000000000..5bdd85e65e --- /dev/null +++ b/tests/test/tgenfunc2.pp @@ -0,0 +1,17 @@ +{ test syntax of a global generic function in mode delphi } + +program tgenfunc2; + +{$mode delphi} + +function Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +begin + if Add(2, 3) <> 5 then + Halt(1); + if Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc3.pp b/tests/test/tgenfunc3.pp new file mode 100644 index 0000000000..924bcd51d0 --- /dev/null +++ b/tests/test/tgenfunc3.pp @@ -0,0 +1,22 @@ +{ test syntax of a generic class function in mode objfpc } + +program tgenfunc3; + +{$mode objfpc} + +type + TTest = class + generic class function Add(aLeft, aRight: T): T; + end; + +generic class function TTest.Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +begin + if TTest.specialize Add(2, 3) <> 5 then + Halt(1); + if TTest.specialize Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc4.pp b/tests/test/tgenfunc4.pp new file mode 100644 index 0000000000..e412773347 --- /dev/null +++ b/tests/test/tgenfunc4.pp @@ -0,0 +1,22 @@ +{ test syntax of a generic class function in mode delphi } + +program tgenfunc4; + +{$mode delphi} + +type + TTest = class + class function Add(aLeft, aRight: T): T; + end; + +class function TTest.Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +begin + if TTest.Add(2, 3) <> 5 then + Halt(1); + if TTest.Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc5.pp b/tests/test/tgenfunc5.pp new file mode 100644 index 0000000000..d9ece40a24 --- /dev/null +++ b/tests/test/tgenfunc5.pp @@ -0,0 +1,24 @@ +{ test syntax of a generic method in mode objfpc } + +program tgenfunc5; + +{$mode objfpc} + +type + TTest = class + generic function Add(aLeft, aRight: T): T; + end; + +generic function TTest.Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +var + t: TTest; +begin + if t.specialize Add(2, 3) <> 5 then + Halt(1); + if t.specialize Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc6.pp b/tests/test/tgenfunc6.pp new file mode 100644 index 0000000000..418a1569fc --- /dev/null +++ b/tests/test/tgenfunc6.pp @@ -0,0 +1,24 @@ +{ test syntax of a generic method in mode delphi } + +program tgenfunc6; + +{$mode delphi} + +type + TTest = class + function Add(aLeft, aRight: T): T; + end; + +function TTest.Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +var + t: TTest; +begin + if t.Add(2, 3) <> 5 then + Halt(1); + if t.Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); +end. diff --git a/tests/test/tgenfunc7.pp b/tests/test/tgenfunc7.pp new file mode 100644 index 0000000000..ab4f7b7a0f --- /dev/null +++ b/tests/test/tgenfunc7.pp @@ -0,0 +1,26 @@ +{ generics in another unit work as well } + +program tgenfunc7; + +{$mode objfpc} + +uses + ugenfunc7; + +var + t: TTest; +begin + if specialize Add(3, 4) <> 7 then + Halt(1); + if specialize Add('Hello', 'World') <> 'HelloWorld' then + Halt(2); + if TTest.specialize AddClass(3, 4) <> 7 then + Halt(3); + if TTest.specialize AddClass('Hello', 'World') <> 'HelloWorld' then + Halt(4); + if t.specialize Add(3, 4) <> 7 then + Halt(5); + if t.specialize Add('Hello', 'World') <> 'HelloWorld' then + Halt(6); +end. + diff --git a/tests/test/tgenfunc8.pp b/tests/test/tgenfunc8.pp new file mode 100644 index 0000000000..656aaac0a3 --- /dev/null +++ b/tests/test/tgenfunc8.pp @@ -0,0 +1,42 @@ +{ %NORUN } + +{ overloads with other generic functions work correctly } + +program tgenfunc8; + +{$mode objfpc} + +operator := (aOther: LongInt): String; +begin + Str(aOther, Result); +end; + +operator := (aOther: String): LongInt; +var + code: LongInt; +begin + Val(aOther, Result, code); +end; + +generic function Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +generic function Add(aLeft, aRight: S): T; +begin + Result := aLeft + aRight; +end; + +generic function Add(aLeft: T): T; +begin + Result := aLeft + aLeft; +end; + +begin + Writeln(specialize Add(4, 5)); + Writeln(specialize Add(3, 8)); + Writeln(specialize Add('3', '8')); + Writeln(specialize Add(2)); + Writeln(specialize Add('Test')); +end. diff --git a/tests/test/tgenfunc9.pp b/tests/test/tgenfunc9.pp new file mode 100644 index 0000000000..7c3fba9d39 --- /dev/null +++ b/tests/test/tgenfunc9.pp @@ -0,0 +1,14 @@ +program tgenfunc9; + +uses + ugenfunc7; + +var + t: TTest; +begin + t := TTest.Create; + Writeln(t.specialize GetStrictPrivate); + Writeln(t.specialize GetPrivate); + Writeln(t.specialize GetStrictProtected); + Writeln(t.specialize GetProtected); +end. diff --git a/tests/test/ugenfunc7.pp b/tests/test/ugenfunc7.pp new file mode 100644 index 0000000000..f3b98ac9f2 --- /dev/null +++ b/tests/test/ugenfunc7.pp @@ -0,0 +1,74 @@ +unit ugenfunc7; + +{$mode objfpc} + +interface + +type + TTest = class + constructor Create; + generic function Add(aLeft, aRight: T): T; + generic class function AddClass(aLeft, aRight: T): T; + generic function GetPrivate: T; + generic function GetProtected: T; + generic function GetStrictPrivate: T; + generic function GetStrictProtected: T; + strict private + fStrictPrivate: LongInt; + private + fPrivate: LongInt; + strict protected + fStrictProtected: LongInt; + protected + fProtected: LongInt; + end; + +generic function Add(aLeft, aRight: T): T; + +implementation + +constructor TTest.Create; +begin + fStrictPrivate := 1; + fPrivate := 2; + fStrictProtected := 3; + fProtected := 4; +end; + +generic function TTest.Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +generic class function TTest.AddClass(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +generic function TTest.GetStrictPrivate: T; +begin + Result := fStrictPrivate; +end; + +generic function TTest.GetPrivate: T; +begin + Result := fPrivate; +end; + +generic function TTest.GetStrictProtected: T; +begin + Result := fStrictProtected; +end; + +generic function TTest.GetProtected: T; +begin + Result := fProtected; +end; + +generic function Add(aLeft, aRight: T): T; +begin + Result := aLeft + aRight; +end; + +end. +