8
Classes, SysUtils, fpcunit, testutils, testregistry;
11
TTestSceneCore = class(TTestCase)
13
procedure TestBorderManifoldEdges;
14
procedure TestIterator;
15
{ $define ITERATOR_SPEED_TEST}
16
{$ifdef ITERATOR_SPEED_TEST}
17
procedure TestIteratorSpeed;
18
{$endif ITERATOR_SPEED_TEST}
24
uses X3DNodes, CastleSceneCore, X3DLoad, CastleVectors, CastleShapes,
25
CastleTimeUtils, CastleStringUtils, X3DFields;
27
procedure TTestSceneCore.TestBorderManifoldEdges;
29
Scene: TCastleSceneCore;
31
Scene := TCastleSceneCore.Create(nil);
33
Scene.Load('data' + PathDelim + 'model_manifold.wrl');
34
Assert(Scene.BorderEdges.Count = 0);
35
finally FreeAndNil(Scene) end;
38
{$ifdef ITERATOR_SPEED_TEST}
39
procedure TTestSceneCore.TestIteratorSpeed;
41
procedure CheckIteratorSpeed(const FileName: string;
42
const TestCount: Integer = 1000);
44
Scene: TCastleSceneCore;
46
SI: TShapeTreeIterator;
51
Writeln('CheckIteratorSpeed on ', FileName);
53
Scene := TCastleSceneCore.Create(nil);
56
for OnlyActive := false to true do
59
for Test := 0 to TestCount - 1 do
61
List := TShapesList.Create(Scene.Shapes, OnlyActive);
62
for I := 0 to List.Count - 1 do
63
{ Just do anything that requires access to List[I] }
64
PointerToStr(List[I].Geometry);
67
Writeln('TShapesList traverse: ', ProcessTimerEnd:1:2);
70
for Test := 0 to TestCount - 1 do
72
SI := TShapeTreeIterator.Create(Scene.Shapes, OnlyActive);
74
PointerToStr(SI.Current.Geometry);
77
Writeln('TShapeTreeIterator: ', ProcessTimerEnd:1:2);
80
finally FreeAndNil(Scene) end;
84
CheckIteratorSpeed('../../demo_models/x3d/deranged_house_final.x3dv');
85
CheckIteratorSpeed('../../demo_models/x3d/anchor_test.x3dv');
86
CheckIteratorSpeed('../../demo_models/x3d/switches_and_transforms.x3dv');
87
CheckIteratorSpeed('../../demo_models/x3d/key_sensor.x3dv');
89
CheckIteratorSpeed('data' + PathDelim + 'switches_and_transforms_2.x3dv');
90
CheckIteratorSpeed('data' + PathDelim + 'key_sensor_2.x3dv');
92
CheckIteratorSpeed('/home/michalis/sources/rrtankticks2/rrtankticks3/rrtt.wrl',
93
10); { smaller TestCount, as it's quite slow }
95
{$endif ITERATOR_SPEED_TEST}
97
procedure TTestSceneCore.TestIterator;
99
procedure CheckIterator(const FileName: string);
101
Scene: TCastleSceneCore;
103
SI: TShapeTreeIterator;
107
Scene := TCastleSceneCore.Create(nil);
109
Scene.Load(FileName);
110
for OnlyActive := false to true do
112
{ Compare the simple iterator implementation (that just calls
113
Traverse and gathers results to the list) with actual sophisticated
114
implementation in TShapeTreeIterator. }
115
List := TShapeList.Create(Scene.Shapes, OnlyActive);
116
SI := TShapeTreeIterator.Create(Scene.Shapes, OnlyActive);
117
for I := 0 to List.Count - 1 do
119
Check(SI.GetNext, 'SI.GetNext');
120
Check(SI.Current = List[I], 'SI.Current');
122
Check(not SI.GetNext, 'not SI.GetNext');
124
// writeln('done for ', FileName, ' active: ', OnlyActive, ' count is ', List.Count);
129
finally FreeAndNil(Scene) end;
133
{$ifdef CASTLE_ENGINE_TRUNK_AVAILABLE}
134
CheckIterator('../../demo_models/x3d/deranged_house_final.x3dv');
135
CheckIterator('../../demo_models/x3d/anchor_test.x3dv');
136
CheckIterator('../../demo_models/x3d/switches_and_transforms.x3dv');
137
CheckIterator('../../demo_models/x3d/key_sensor.x3dv');
138
{$endif CASTLE_ENGINE_TRUNK_AVAILABLE}
140
CheckIterator('data' + PathDelim + 'switches_and_transforms_2.x3dv');
141
CheckIterator('data' + PathDelim + 'key_sensor_2.x3dv');
142
CheckIterator('data' + PathDelim + 'extrusion_empty_spine.x3dv');
143
CheckIterator('data' + PathDelim + 'extrusion_empty_spine_concave.x3dv');
144
CheckIterator('data' + PathDelim + 'extrusion_empty_spine_smooth.x3dv');
147
procedure TTestSceneCore.TestFind;
149
Scene: TCastleSceneCore;
151
Scene := TCastleSceneCore.Create(nil);
155
Assert(false, 'Should fail with EX3DNotFound');
156
except on EX3DNotFound do ; end;
159
Scene.Field('Left', 'translation');
160
Assert(false, 'Should fail with EX3DNotFound');
161
except on EX3DNotFound do ; end;
164
Scene.Event('Left', 'addChildren');
165
Assert(false, 'Should fail with EX3DNotFound');
166
except on EX3DNotFound do ; end;
168
Scene.FileName := 'data' + PathDelim + 'switches_and_transforms_2.x3dv';
170
Scene.Field('Left', 'translation');
171
Scene.Event('Left', 'addChildren');
175
Assert(false, 'Should fail with EX3DNotFound');
176
except on EX3DNotFound do ; end;
179
Scene.Field('Blah', 'translation');
180
Assert(false, 'Should fail with EX3DNotFound');
181
except on EX3DNotFound do ; end;
184
Scene.Event('Blah', 'addChildren');
185
Assert(false, 'Should fail with EX3DNotFound');
186
except on EX3DNotFound do ; end;
189
Scene.Field('Left', 'blah');
190
Assert(false, 'Should fail with EX3DNotFound');
191
except on EX3DNotFound do ; end;
194
Scene.Event('Left', 'blah');
195
Assert(false, 'Should fail with EX3DNotFound');
196
except on EX3DNotFound do ; end;
197
finally FreeAndNil(Scene) end;
201
RegisterTest(TTestSceneCore);