unit uutlObservableMapTests; {$mode objfpc}{$H+} interface uses Classes, SysUtils, TestFramework, uutlGenerics, uutlObservable, uutlEvent; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TObservableIntStringMap = specialize TutlObservableMap; TEventArgList = specialize TutlList; TutlObservableMapTests = class(TTestCase) private fCaptureEvents: Boolean; fMap: TObservableIntStringMap; fEventArgs: TEventArgList; procedure EventHandler(constref aSender: TObject; constref aEventArgs: IutlEventArgs); public procedure SetUp; override; procedure TearDown; override; published procedure Add; procedure Delete; procedure ReplaceItem; procedure Clear; end; implementation //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlObservableMapTests//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.EventHandler(constref aSender: TObject; constref aEventArgs: IutlEventArgs); begin if fCaptureEvents then fEventArgs.Add(aEventArgs); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.SetUp; begin inherited SetUp; fCaptureEvents := false; fEventArgs := TEventArgList.Create(true); fMap := TObservableIntStringMap.Create(true, true); fMap.RegisterEventHandler(@EventHandler); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.TearDown; begin FreeAndNil(fMap); FreeAndNil(fEventArgs); inherited TearDown; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.Add; var ea: TObservableIntStringMap.TItemEventArgs; begin fCaptureEvents := true; fMap.Add(5, 'Test1'); fMap.Add(7, 'Test2'); AssertEquals(2, fEventArgs.Count); AssertTrue (Supports(fEventArgs[0], TObservableIntStringMap.TItemEventArgs, ea)); AssertTrue (oetAdd = ea.EventType); AssertEquals(0, ea.Index); AssertEquals(5, ea.Key); AssertEquals('Test1', ea.Item); AssertTrue (Supports(fEventArgs[1], TObservableIntStringMap.TItemEventArgs, ea)); AssertTrue (oetAdd = ea.EventType); AssertEquals(1, ea.Index); AssertEquals(7, ea.Key); AssertEquals('Test2', ea.Item); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.Delete; var ea: TObservableIntStringMap.TItemEventArgs; begin fMap.Add(5, 'Test1'); fMap.Add(10, 'Test2'); fMap.Add(15, 'Test3'); fCaptureEvents := true; fMap.Delete(5); fMap.Delete(10); AssertEquals(2, fEventArgs.Count); AssertTrue (Supports(fEventArgs[0], TObservableIntStringMap.TItemEventArgs, ea)); AssertTrue (oetRemove = ea.EventType); AssertEquals(0, ea.Index); AssertEquals(5, ea.Key); AssertEquals('Test1', ea.Item); AssertTrue (Supports(fEventArgs[1], TObservableIntStringMap.TItemEventArgs, ea)); AssertTrue (oetRemove = ea.EventType); AssertEquals(0, ea.Index); AssertEquals(10, ea.Key); AssertEquals('Test2', ea.Item); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.ReplaceItem; var ea: TObservableIntStringMap.TReplaceEventArgs; begin fMap.Add(5, 'Test1'); fMap.Add(10, 'Test2'); fMap.Add(15, 'Test3'); fCaptureEvents := true; fMap[ 5] := 'Replace1'; fMap[10] := 'Replace2'; AssertEquals(2, fEventArgs.Count); AssertTrue (Supports(fEventArgs[0], TObservableIntStringMap.TReplaceEventArgs, ea)); AssertTrue (oetReplace = ea.EventType); AssertEquals(0, ea.Index); AssertEquals(5, ea.Key); AssertEquals('Test1', ea.OldItem); AssertEquals('Replace1', ea.NewItem); AssertTrue (Supports(fEventArgs[1], TObservableIntStringMap.TReplaceEventArgs, ea)); AssertTrue (oetReplace = ea.EventType); AssertEquals(1, ea.Index); AssertEquals(10, ea.Key); AssertEquals('Test2', ea.OldItem); AssertEquals('Replace2', ea.NewItem); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlObservableMapTests.Clear; var ea: TObservableIntStringMap.TReplaceEventArgs; begin fMap.Add(5, 'Test1'); fMap.Add(10, 'Test2'); fMap.Add(15, 'Test3'); fCaptureEvents := true; fMap.Clear; AssertEquals(1, fEventArgs.Count); AssertTrue (Supports(fEventArgs[0], TutlObservableEventArgs, ea)); AssertTrue (oetClear = ea.EventType); end; initialization RegisterTest(TutlObservableMapTests.Suite); end.