23
23
import static androidx .media3 .test .utils .TestUtil .assertSubclassOverridesAllMethods ;
24
24
import static androidx .media3 .test .utils .TestUtil .getInnerClass ;
25
25
import static com .google .common .truth .Truth .assertThat ;
26
+ import static org .junit .Assert .assertThrows ;
26
27
import static org .mockito .ArgumentMatchers .same ;
27
28
import static org .mockito .Mockito .mock ;
28
29
import static org .mockito .Mockito .verify ;
29
30
31
+ import androidx .annotation .Nullable ;
30
32
import androidx .media3 .test .utils .StubPlayer ;
31
33
import androidx .test .ext .junit .runners .AndroidJUnit4 ;
32
34
import com .google .common .collect .ImmutableSet ;
35
+ import java .util .ArrayList ;
33
36
import java .util .HashSet ;
37
+ import java .util .List ;
34
38
import java .util .Set ;
35
39
import org .junit .Test ;
36
40
import org .junit .runner .RunWith ;
41
45
public class ForwardingPlayerTest {
42
46
43
47
@ Test
44
- public void addListener_addsForwardingListener () {
45
- FakePlayer player = new FakePlayer ();
46
- Player .Listener listener1 = mock (Player .Listener .class );
47
- Player .Listener listener2 = mock (Player .Listener .class );
48
+ public void addListener_addsForwardingListener_toEqualityBasedPlayer () {
49
+ EqualityBasedFakePlayer player = new EqualityBasedFakePlayer ();
50
+ Player .Listener listener1 = new AllIsEqualPlayerListener ();
51
+ Player .Listener listener2 = new AllIsEqualPlayerListener ();
52
+ assertThat (listener1 ).isEqualTo (listener2 );
53
+ assertThat (listener2 ).isEqualTo (listener1 );
54
+ assertThat (listener1 .hashCode ()).isEqualTo (2 );
55
+ assertThat (listener2 .hashCode ()).isEqualTo (2 );
48
56
57
+ player .addListener (listener1 );
58
+ // Add listener1 again.
59
+ player .addListener (listener1 );
60
+ player .addListener (listener2 );
61
+ assertThat (player .listeners ).hasSize (1 );
62
+ player .listeners .clear ();
63
+
64
+ // Even though the listeners are equal, ForwardingPlayer should hide this from the player.
49
65
ForwardingPlayer forwardingPlayer = new ForwardingPlayer (player );
50
66
forwardingPlayer .addListener (listener1 );
51
67
// Add listener1 again.
@@ -56,10 +72,27 @@ public void addListener_addsForwardingListener() {
56
72
}
57
73
58
74
@ Test
59
- public void removeListener_removesForwardingListener () {
60
- FakePlayer player = new FakePlayer ();
61
- Player .Listener listener1 = mock (Player .Listener .class );
62
- Player .Listener listener2 = mock (Player .Listener .class );
75
+ public void removeListener_removesForwardingListener_toEqualityBasedPlayer () {
76
+ EqualityBasedFakePlayer player = new EqualityBasedFakePlayer ();
77
+ Player .Listener listener1 = new AllIsEqualPlayerListener ();
78
+ Player .Listener listener2 = new AllIsEqualPlayerListener ();
79
+ assertThat (listener1 ).isEqualTo (listener2 );
80
+ assertThat (listener2 ).isEqualTo (listener1 );
81
+ assertThat (listener1 .hashCode ()).isEqualTo (2 );
82
+ assertThat (listener2 .hashCode ()).isEqualTo (2 );
83
+
84
+ player .addListener (listener1 );
85
+ player .addListener (listener2 );
86
+ assertThat (player .listeners ).hasSize (1 );
87
+ player .removeListener (listener1 );
88
+ assertThat (player .listeners ).isEmpty ();
89
+ // Remove same listener again.
90
+ player .removeListener (listener1 );
91
+ assertThat (player .listeners ).isEmpty ();
92
+ player .removeListener (listener2 );
93
+ assertThat (player .listeners ).isEmpty ();
94
+
95
+ // Even though the listeners are equal, ForwardingPlayer should hide this from the player.
63
96
ForwardingPlayer forwardingPlayer = new ForwardingPlayer (player );
64
97
forwardingPlayer .addListener (listener1 );
65
98
forwardingPlayer .addListener (listener2 );
@@ -73,9 +106,78 @@ public void removeListener_removesForwardingListener() {
73
106
assertThat (player .listeners ).isEmpty ();
74
107
}
75
108
109
+ @ Test
110
+ public void addListener_addsForwardingListener_toIdentityBasedPlayer () {
111
+ IdentityBasedFakePlayer player = new IdentityBasedFakePlayer ();
112
+ Player .Listener listener1 = new AllIsEqualPlayerListener ();
113
+ Player .Listener listener2 = new AllIsEqualPlayerListener ();
114
+ assertThat (listener1 ).isEqualTo (listener2 );
115
+ assertThat (listener2 ).isEqualTo (listener1 );
116
+ assertThat (listener1 .hashCode ()).isEqualTo (2 );
117
+ assertThat (listener2 .hashCode ()).isEqualTo (2 );
118
+
119
+ player .addListener (listener1 );
120
+ // Add listener1 again.
121
+ assertThrows (IllegalArgumentException .class , () -> player .addListener (listener1 ));
122
+ assertThat (player .listeners ).hasSize (1 );
123
+ assertThrows (IllegalArgumentException .class , () -> player .removeListener (listener2 ));
124
+ assertThat (player .listeners ).hasSize (1 );
125
+ player .addListener (listener2 );
126
+
127
+ assertThat (player .listeners ).hasSize (2 );
128
+ player .listeners .clear ();
129
+
130
+ // The listeners are equal, but the Player handles that, and ForwardingPlayer should, too.
131
+ ForwardingPlayer forwardingPlayer = new ForwardingPlayer (player );
132
+ forwardingPlayer .addListener (listener1 );
133
+ // Add listener1 again.
134
+ assertThrows (IllegalArgumentException .class , () -> forwardingPlayer .addListener (listener1 ));
135
+ assertThat (player .listeners ).hasSize (1 );
136
+ assertThrows (IllegalArgumentException .class , () -> forwardingPlayer .removeListener (listener2 ));
137
+ assertThat (player .listeners ).hasSize (1 );
138
+ forwardingPlayer .addListener (listener2 );
139
+
140
+ assertThat (player .listeners ).hasSize (2 );
141
+ }
142
+
143
+ @ Test
144
+ public void removeListener_removesForwardingListener_toIdentityBasedPlayer () {
145
+ IdentityBasedFakePlayer player = new IdentityBasedFakePlayer ();
146
+ Player .Listener listener1 = new AllIsEqualPlayerListener ();
147
+ Player .Listener listener2 = new AllIsEqualPlayerListener ();
148
+ assertThat (listener1 ).isEqualTo (listener2 );
149
+ assertThat (listener2 ).isEqualTo (listener1 );
150
+ assertThat (listener1 .hashCode ()).isEqualTo (2 );
151
+ assertThat (listener2 .hashCode ()).isEqualTo (2 );
152
+
153
+ player .addListener (listener1 );
154
+ player .addListener (listener2 );
155
+
156
+ player .removeListener (listener1 );
157
+ assertThat (player .listeners ).hasSize (1 );
158
+ // Remove same listener again.
159
+ assertThrows (IllegalArgumentException .class , () -> player .removeListener (listener1 ));
160
+ assertThat (player .listeners ).hasSize (1 );
161
+ player .removeListener (listener2 );
162
+ assertThat (player .listeners ).isEmpty ();
163
+
164
+ // The listeners are equal, but the Player handles that, and ForwardingPlayer should, too.
165
+ ForwardingPlayer forwardingPlayer = new ForwardingPlayer (player );
166
+ forwardingPlayer .addListener (listener1 );
167
+ forwardingPlayer .addListener (listener2 );
168
+
169
+ forwardingPlayer .removeListener (listener1 );
170
+ assertThat (player .listeners ).hasSize (1 );
171
+ // Remove same listener again.
172
+ assertThrows (IllegalArgumentException .class , () -> forwardingPlayer .removeListener (listener1 ));
173
+ assertThat (player .listeners ).hasSize (1 );
174
+ forwardingPlayer .removeListener (listener2 );
175
+ assertThat (player .listeners ).isEmpty ();
176
+ }
177
+
76
178
@ Test
77
179
public void onEvents_passesForwardingPlayerAsArgument () {
78
- FakePlayer player = new FakePlayer ();
180
+ EqualityBasedFakePlayer player = new EqualityBasedFakePlayer ();
79
181
Player .Listener listener = mock (Player .Listener .class );
80
182
ForwardingPlayer forwardingPlayer = new ForwardingPlayer (player );
81
183
forwardingPlayer .addListener (listener );
@@ -125,7 +227,7 @@ public void forwardingListener_overridesAllListenerMethods() throws Exception {
125
227
assertSubclassOverridesAllMethods (Player .Listener .class , forwardingListenerClass );
126
228
}
127
229
128
- private static class FakePlayer extends StubPlayer {
230
+ private static class EqualityBasedFakePlayer extends StubPlayer {
129
231
130
232
private final Set <Listener > listeners = new HashSet <>();
131
233
@@ -139,4 +241,46 @@ public void removeListener(Listener listener) {
139
241
listeners .remove (listener );
140
242
}
141
243
}
244
+
245
+ private static class IdentityBasedFakePlayer extends StubPlayer {
246
+
247
+ private final List <Listener > listeners = new ArrayList <>();
248
+
249
+ @ Override
250
+ public void addListener (Listener listener ) {
251
+ for (Listener listener1 : listeners ) {
252
+ if (listener == listener1 ) {
253
+ throw new IllegalArgumentException ("Trying to add duplicate listener added" );
254
+ }
255
+ }
256
+ listeners .add (listener );
257
+ }
258
+
259
+ @ Override
260
+ public void removeListener (Listener listener ) {
261
+ int found = -1 ;
262
+ for (int i = 0 ; i < listeners .size (); i ++) {
263
+ if (listener == listeners .get (i )) {
264
+ found = i ;
265
+ }
266
+ }
267
+ if (found == -1 ) {
268
+ throw new IllegalArgumentException ("Trying to remove listener that doesn't exist" );
269
+ }
270
+ listeners .remove (found );
271
+ }
272
+ }
273
+
274
+ private static class AllIsEqualPlayerListener implements Player .Listener {
275
+
276
+ @ Override
277
+ public boolean equals (@ Nullable Object obj ) {
278
+ return true ;
279
+ }
280
+
281
+ @ Override
282
+ public int hashCode () {
283
+ return 2 ;
284
+ }
285
+ }
142
286
}
0 commit comments