Home Creating unit tests for Delphi with ChatGPT
Post
Cancel

Creating unit tests for Delphi with ChatGPT

The last post was a simple poem generated by ChatGPT which praised the qualities of Delphi. But ChatGPT is storming the world right now and it’s not because it can generate poems. It’s much more than that. To demonstrate, here is the question posed today to ChatGPT and its response.

Prompt

Please generate DUnit test cases to adequately cover the TCountdownEvent system class in Delphi.

Response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
unit TestCountdownEvent;

interface

uses
  TestFramework, System.SyncObjs;

type
  TestTCountdownEvent = class(TTestCase)
  private
    FEvent: TCountdownEvent;
  public
    procedure SetUp; override;
    procedure TearDown; override;
  published
    procedure TestInitialCount;
    procedure TestSignal;
    procedure TestWaitFor;
  end;

implementation

procedure TestTCountdownEvent.SetUp;
begin
  FEvent := TCountdownEvent.Create(3);
end;

procedure TestTCountdownEvent.TearDown;
begin
  FEvent.Free;
end;

procedure TestTCountdownEvent.TestInitialCount;
begin
  CheckEquals(3, FEvent.InitialCount);
end;

procedure TestTCountdownEvent.TestSignal;
begin
  FEvent.Signal;
  CheckEquals(2, FEvent.CurrentCount);
  FEvent.Signal(2);
  CheckEquals(0, FEvent.CurrentCount);
end;

procedure TestTCountdownEvent.TestWaitFor;
var
  LStartTime: TDateTime;
  LElapsedTime: TDateTime;
begin
  LStartTime := Now;
  FEvent.WaitFor(1000);
  LElapsedTime := Now - LStartTime;
  CheckTrue(LElapsedTime >= 1.0, 'WaitFor took less than 1 second');
end;

initialization
  RegisterTest(TestTCountdownEvent.Suite);

end.

The initial response did not provide adequate test coverage, but it was certainly more complete than I anticipated. A very minor problem was that it used the Now function but did not include System.SysUtils in the Uses clause. The bigger problem is the WaitFor testcase is simply inaccurate as-generated. I asked it to correct the code, which it did without issue. I then asked it to generate some more tests.

Prompt

Please add a few more tests. For example, test if you add a zero or a negative initial value using TryAddCount that an exception occurs. Test if you attempt to Signal when the count is zero that an exception occurs.

Response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TestTCountdownEvent.TestTryAddCount;
begin
  CheckFalse(FEvent.TryAddCount(-1), 'TryAddCount with negative count succeeded');
  CheckFalse(FEvent.TryAddCount(0), 'TryAddCount with zero count succeeded');
end;

procedure TestTCountdownEvent.TestSignalWhenZero;
begin
  FEvent.Signal(3);
  CheckEquals(0, FEvent.CurrentCount, 'Initial count not reduced to zero');
  CheckException(ECountdownEventException,
    procedure begin FEvent.Signal end,
    'Signal did not raise exception when count is zero');
end;

It attempted to do as requested, but the results were incorrect. After a little more back and forth, it eventually produced the requested code.

So, the results are not perfect, but are still somewhat impressive. Will you use ChatGPT to help you code in Delphi? It might be a little too early to rely on code generation for Delphi, but I assume that the results will improve over time and this will be an extremely powerful tool for any developer. Many developers are already including ChatGPT in their daily routines. I have even seen a few different ChatGPT plugins for Delphi being released. ChatGPT is here to stay and it will certainly change the future…hopefully for the better! It does seem to be inherently biased on the political/social side of things but we will leave those discussions to be had over a beer.

Delphi Logo combined with ChatGPT logo