1 // Copyright 2017 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <gtest/gtest.h>
6
7 #include "include/gestures.h"
8 #include "include/timestamp_filter_interpreter.h"
9 #include "include/unittest_util.h"
10 #include "include/util.h"
11
12 namespace gestures {
13
14 class TimestampFilterInterpreterTest : public ::testing::Test {};
15
16 class TimestampFilterInterpreterTestInterpreter : public Interpreter {
17 public:
TimestampFilterInterpreterTestInterpreter()18 TimestampFilterInterpreterTestInterpreter()
19 : Interpreter(NULL, NULL, false) {}
20 };
21
make_hwstate_times(stime_t timestamp,stime_t msc_timestamp)22 static HardwareState make_hwstate_times(stime_t timestamp,
23 stime_t msc_timestamp) {
24 return { timestamp, 0, 1, 1, NULL, 0, 0, 0, 0, 0, msc_timestamp };
25 }
26
TEST(TimestampFilterInterpreterTest,SimpleTest)27 TEST(TimestampFilterInterpreterTest, SimpleTest) {
28 TimestampFilterInterpreterTestInterpreter* base_interpreter =
29 new TimestampFilterInterpreterTestInterpreter;
30 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
31 TestInterpreterWrapper wrapper(&interpreter);
32
33 HardwareState hs[] = {
34 make_hwstate_times(1.000, 0.000),
35 make_hwstate_times(1.010, 0.012),
36 make_hwstate_times(1.020, 0.018),
37 make_hwstate_times(1.030, 0.031),
38 };
39
40 stime_t expected_timestamps[] = { 1.000, 1.012, 1.018, 1.031 };
41
42 for (size_t i = 0; i < arraysize(hs); i++) {
43 wrapper.SyncInterpret(&hs[i], NULL);
44 EXPECT_EQ(hs[i].timestamp, expected_timestamps[i]);
45 }
46 }
47
TEST(TimestampFilterInterpreterTest,NoMscTimestampTest)48 TEST(TimestampFilterInterpreterTest, NoMscTimestampTest) {
49 TimestampFilterInterpreterTestInterpreter* base_interpreter =
50 new TimestampFilterInterpreterTestInterpreter;
51 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
52 TestInterpreterWrapper wrapper(&interpreter);
53
54 HardwareState hs[] = {
55 make_hwstate_times(1.000, 0.000),
56 make_hwstate_times(1.010, 0.000),
57 make_hwstate_times(1.020, 0.000),
58 make_hwstate_times(1.030, 0.000),
59 };
60
61 for (size_t i = 0; i < arraysize(hs); i++) {
62 stime_t expected_timestamp = hs[i].timestamp;
63 wrapper.SyncInterpret(&hs[i], NULL);
64 EXPECT_EQ(hs[i].timestamp, expected_timestamp);
65 }
66 }
67
TEST(TimestampFilterInterpreterTest,MscTimestampResetTest)68 TEST(TimestampFilterInterpreterTest, MscTimestampResetTest) {
69 TimestampFilterInterpreterTestInterpreter* base_interpreter =
70 new TimestampFilterInterpreterTestInterpreter;
71 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
72 TestInterpreterWrapper wrapper(&interpreter);
73
74 HardwareState hs[] = {
75 make_hwstate_times(1.000, 0.000),
76 make_hwstate_times(1.010, 0.012),
77 make_hwstate_times(1.020, 0.018),
78 make_hwstate_times(1.030, 0.031),
79 make_hwstate_times(3.000, 0.000), // msc_timestamp reset to 0
80 make_hwstate_times(3.010, 0.008),
81 make_hwstate_times(3.020, 0.020),
82 make_hwstate_times(3.030, 0.035),
83 };
84
85 stime_t expected_timestamps[] = {
86 1.000, 1.012, 1.018, 1.031,
87 3.000, 3.008, 3.020, 3.035
88 };
89
90 for (size_t i = 0; i < arraysize(hs); i++) {
91 wrapper.SyncInterpret(&hs[i], NULL);
92 EXPECT_EQ(hs[i].timestamp, expected_timestamps[i]);
93 }
94 }
95
TEST(TimestampFilterInterpreterTest,FakeTimestampTest)96 TEST(TimestampFilterInterpreterTest, FakeTimestampTest) {
97 TimestampFilterInterpreterTestInterpreter* base_interpreter =
98 new TimestampFilterInterpreterTestInterpreter;
99 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
100 TestInterpreterWrapper wrapper(&interpreter);
101
102 interpreter.fake_timestamp_delta_.val_ = 0.010;
103
104 HardwareState hs[] = {
105 make_hwstate_times(1.000, 0.002),
106 make_hwstate_times(1.002, 6.553),
107 make_hwstate_times(1.008, 0.001),
108 make_hwstate_times(1.031, 0.001),
109 };
110
111 stime_t expected_timestamps[] = { 1.000, 1.010, 1.020, 1.030 };
112
113 for (size_t i = 0; i < arraysize(hs); i++) {
114 wrapper.SyncInterpret(&hs[i], NULL);
115 EXPECT_TRUE(DoubleEq(hs[i].timestamp, expected_timestamps[i]));
116 }
117 }
118
TEST(TimestampFilterInterpreterTest,FakeTimestampJumpForwardTest)119 TEST(TimestampFilterInterpreterTest, FakeTimestampJumpForwardTest) {
120 TimestampFilterInterpreterTestInterpreter* base_interpreter =
121 new TimestampFilterInterpreterTestInterpreter;
122 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
123 TestInterpreterWrapper wrapper(&interpreter);
124
125 interpreter.fake_timestamp_delta_.val_ = 0.010;
126
127 HardwareState hs[] = {
128 make_hwstate_times(1.000, 0.002),
129 make_hwstate_times(1.002, 6.553),
130 make_hwstate_times(1.008, 0.001),
131 make_hwstate_times(1.031, 0.001),
132 make_hwstate_times(2.000, 6.552),
133 make_hwstate_times(2.002, 6.553),
134 make_hwstate_times(2.008, 0.002),
135 make_hwstate_times(2.031, 0.001),
136 };
137
138 stime_t expected_timestamps[] = {
139 1.000, 1.010, 1.020, 1.030,
140 2.000, 2.010, 2.020, 2.030
141 };
142
143 for (size_t i = 0; i < arraysize(hs); i++) {
144 wrapper.SyncInterpret(&hs[i], NULL);
145 EXPECT_TRUE(DoubleEq(hs[i].timestamp, expected_timestamps[i]));
146 }
147 }
148
TEST(TimestampFilterInterpreterTest,FakeTimestampFallBackwardTest)149 TEST(TimestampFilterInterpreterTest, FakeTimestampFallBackwardTest) {
150 TimestampFilterInterpreterTestInterpreter* base_interpreter =
151 new TimestampFilterInterpreterTestInterpreter;
152 TimestampFilterInterpreter interpreter(NULL, base_interpreter, NULL);
153 TestInterpreterWrapper wrapper(&interpreter);
154
155 interpreter.fake_timestamp_delta_.val_ = 0.010;
156 interpreter.fake_timestamp_max_divergence_ = 0.030;
157
158 HardwareState hs[] = {
159 make_hwstate_times(1.000, 0.002),
160 make_hwstate_times(1.001, 6.553),
161 make_hwstate_times(1.002, 0.001),
162 make_hwstate_times(1.003, 0.001),
163 make_hwstate_times(1.004, 6.552),
164 make_hwstate_times(1.005, 6.553),
165 make_hwstate_times(1.006, 0.002),
166 make_hwstate_times(1.007, 6.552),
167 };
168
169 stime_t expected_timestamps[] = {
170 1.000, 1.010, 1.020, 1.030,
171 1.004, 1.014, 1.024, 1.034,
172 };
173
174 for (size_t i = 0; i < arraysize(hs); i++) {
175 wrapper.SyncInterpret(&hs[i], NULL);
176 EXPECT_TRUE(DoubleEq(hs[i].timestamp, expected_timestamps[i]));
177 }
178 }
179 } // namespace gestures
180