~ubuntu-branches/ubuntu/utopic/castle-game-engine/utopic

« back to all changes in this revision

Viewing changes to tests/testscenecore.pas

  • Committer: Package Import Robot
  • Author(s): Abou Al Montacir
  • Date: 2013-04-27 18:06:40 UTC
  • Revision ID: package-import@ubuntu.com-20130427180640-eink4nmwzuivez1c
Tags: upstream-4.0.1
ImportĀ upstreamĀ versionĀ 4.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
unit TestSceneCore;
 
2
 
 
3
{$I tests.inc}
 
4
 
 
5
interface
 
6
 
 
7
uses
 
8
  Classes, SysUtils, fpcunit, testutils, testregistry;
 
9
 
 
10
type
 
11
  TTestSceneCore = class(TTestCase)
 
12
  published
 
13
    procedure TestBorderManifoldEdges;
 
14
    procedure TestIterator;
 
15
    { $define ITERATOR_SPEED_TEST}
 
16
    {$ifdef ITERATOR_SPEED_TEST}
 
17
    procedure TestIteratorSpeed;
 
18
    {$endif ITERATOR_SPEED_TEST}
 
19
    procedure TestFind;
 
20
  end;
 
21
 
 
22
implementation
 
23
 
 
24
uses X3DNodes, CastleSceneCore, X3DLoad, CastleVectors, CastleShapes,
 
25
  CastleTimeUtils, CastleStringUtils, X3DFields;
 
26
 
 
27
procedure TTestSceneCore.TestBorderManifoldEdges;
 
28
var
 
29
  Scene: TCastleSceneCore;
 
30
begin
 
31
  Scene := TCastleSceneCore.Create(nil);
 
32
  try
 
33
    Scene.Load('data' + PathDelim + 'model_manifold.wrl');
 
34
    Assert(Scene.BorderEdges.Count = 0);
 
35
  finally FreeAndNil(Scene) end;
 
36
end;
 
37
 
 
38
{$ifdef ITERATOR_SPEED_TEST}
 
39
procedure TTestSceneCore.TestIteratorSpeed;
 
40
 
 
41
  procedure CheckIteratorSpeed(const FileName: string;
 
42
    const TestCount: Integer = 1000);
 
43
  var
 
44
    Scene: TCastleSceneCore;
 
45
    List: TShapesList;
 
46
    SI: TShapeTreeIterator;
 
47
    OnlyActive: boolean;
 
48
    I: Integer;
 
49
    Test: Integer;
 
50
  begin
 
51
    Writeln('CheckIteratorSpeed on ', FileName);
 
52
 
 
53
    Scene := TCastleSceneCore.Create(nil);
 
54
    try
 
55
      Scene.Load(FileName);
 
56
      for OnlyActive := false to true do
 
57
      begin
 
58
        ProcessTimerBegin;
 
59
        for Test := 0 to TestCount - 1 do
 
60
        begin
 
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);
 
65
          FreeAndNil(List);
 
66
        end;
 
67
        Writeln('TShapesList traverse: ', ProcessTimerEnd:1:2);
 
68
 
 
69
        ProcessTimerBegin;
 
70
        for Test := 0 to TestCount - 1 do
 
71
        begin
 
72
          SI := TShapeTreeIterator.Create(Scene.Shapes, OnlyActive);
 
73
          while SI.GetNext do
 
74
            PointerToStr(SI.Current.Geometry);
 
75
          FreeAndNil(SI);
 
76
        end;
 
77
        Writeln('TShapeTreeIterator: ', ProcessTimerEnd:1:2);
 
78
 
 
79
      end;
 
80
    finally FreeAndNil(Scene) end;
 
81
  end;
 
82
 
 
83
begin
 
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');
 
88
 
 
89
  CheckIteratorSpeed('data' + PathDelim + 'switches_and_transforms_2.x3dv');
 
90
  CheckIteratorSpeed('data' + PathDelim + 'key_sensor_2.x3dv');
 
91
 
 
92
  CheckIteratorSpeed('/home/michalis/sources/rrtankticks2/rrtankticks3/rrtt.wrl',
 
93
    10); { smaller TestCount, as it's quite slow }
 
94
end;
 
95
{$endif ITERATOR_SPEED_TEST}
 
96
 
 
97
procedure TTestSceneCore.TestIterator;
 
98
 
 
99
  procedure CheckIterator(const FileName: string);
 
100
  var
 
101
    Scene: TCastleSceneCore;
 
102
    List: TShapeList;
 
103
    SI: TShapeTreeIterator;
 
104
    OnlyActive: boolean;
 
105
    I: Integer;
 
106
  begin
 
107
    Scene := TCastleSceneCore.Create(nil);
 
108
    try
 
109
      Scene.Load(FileName);
 
110
      for OnlyActive := false to true do
 
111
      begin
 
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
 
118
        begin
 
119
          Check(SI.GetNext, 'SI.GetNext');
 
120
          Check(SI.Current = List[I], 'SI.Current');
 
121
        end;
 
122
        Check(not SI.GetNext, 'not SI.GetNext');
 
123
 
 
124
//        writeln('done for ', FileName, ' active: ', OnlyActive, ' count is ', List.Count);
 
125
 
 
126
        FreeAndNil(List);
 
127
        FreeAndNil(SI);
 
128
      end;
 
129
    finally FreeAndNil(Scene) end;
 
130
  end;
 
131
 
 
132
begin
 
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}
 
139
 
 
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');
 
145
end;
 
146
 
 
147
procedure TTestSceneCore.TestFind;
 
148
var
 
149
  Scene: TCastleSceneCore;
 
150
begin
 
151
  Scene := TCastleSceneCore.Create(nil);
 
152
  try
 
153
    try
 
154
      Scene.Node('Left');
 
155
      Assert(false, 'Should fail with EX3DNotFound');
 
156
    except on EX3DNotFound do ; end;
 
157
 
 
158
    try
 
159
      Scene.Field('Left', 'translation');
 
160
      Assert(false, 'Should fail with EX3DNotFound');
 
161
    except on EX3DNotFound do ; end;
 
162
 
 
163
    try
 
164
      Scene.Event('Left', 'addChildren');
 
165
      Assert(false, 'Should fail with EX3DNotFound');
 
166
    except on EX3DNotFound do ; end;
 
167
 
 
168
    Scene.FileName := 'data' + PathDelim + 'switches_and_transforms_2.x3dv';
 
169
    Scene.Node('Left');
 
170
    Scene.Field('Left', 'translation');
 
171
    Scene.Event('Left', 'addChildren');
 
172
 
 
173
    try
 
174
      Scene.Node('Blah');
 
175
      Assert(false, 'Should fail with EX3DNotFound');
 
176
    except on EX3DNotFound do ; end;
 
177
 
 
178
    try
 
179
      Scene.Field('Blah', 'translation');
 
180
      Assert(false, 'Should fail with EX3DNotFound');
 
181
    except on EX3DNotFound do ; end;
 
182
 
 
183
    try
 
184
      Scene.Event('Blah', 'addChildren');
 
185
      Assert(false, 'Should fail with EX3DNotFound');
 
186
    except on EX3DNotFound do ; end;
 
187
 
 
188
    try
 
189
      Scene.Field('Left', 'blah');
 
190
      Assert(false, 'Should fail with EX3DNotFound');
 
191
    except on EX3DNotFound do ; end;
 
192
 
 
193
    try
 
194
      Scene.Event('Left', 'blah');
 
195
      Assert(false, 'Should fail with EX3DNotFound');
 
196
    except on EX3DNotFound do ; end;
 
197
  finally FreeAndNil(Scene) end;
 
198
end;
 
199
 
 
200
initialization
 
201
  RegisterTest(TTestSceneCore);
 
202
end.