OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.suggestions; | 5 package org.chromium.chrome.browser.suggestions; |
6 | 6 |
7 import static org.hamcrest.CoreMatchers.is; | 7 import static org.hamcrest.CoreMatchers.is; |
8 import static org.junit.Assert.assertNotNull; | 8 import static org.junit.Assert.assertNotNull; |
9 import static org.junit.Assert.assertThat; | 9 import static org.junit.Assert.assertThat; |
10 import static org.junit.Assert.fail; | |
11 import static org.mockito.ArgumentMatchers.any; | 10 import static org.mockito.ArgumentMatchers.any; |
12 import static org.mockito.ArgumentMatchers.anyBoolean; | 11 import static org.mockito.ArgumentMatchers.anyBoolean; |
13 import static org.mockito.ArgumentMatchers.anyInt; | 12 import static org.mockito.ArgumentMatchers.anyInt; |
14 import static org.mockito.Mockito.doAnswer; | 13 import static org.mockito.Mockito.doAnswer; |
15 import static org.mockito.Mockito.mock; | 14 import static org.mockito.Mockito.mock; |
16 import static org.mockito.Mockito.never; | 15 import static org.mockito.Mockito.never; |
17 import static org.mockito.Mockito.reset; | 16 import static org.mockito.Mockito.reset; |
18 import static org.mockito.Mockito.verify; | 17 import static org.mockito.Mockito.verify; |
19 import static org.mockito.Mockito.verifyNoMoreInteractions; | 18 import static org.mockito.Mockito.verifyNoMoreInteractions; |
20 import static org.mockito.Mockito.when; | 19 import static org.mockito.Mockito.when; |
21 | 20 |
22 import android.content.Context; | |
23 import android.content.res.Resources; | |
24 import android.graphics.Bitmap; | 21 import android.graphics.Bitmap; |
25 import android.graphics.Color; | 22 import android.graphics.Color; |
26 import android.support.annotation.ColorRes; | |
27 import android.support.annotation.DimenRes; | |
28 import android.support.annotation.LayoutRes; | |
29 import android.view.LayoutInflater; | |
30 import android.view.View; | 23 import android.view.View; |
31 import android.view.ViewGroup; | 24 import android.view.ViewGroup; |
32 import android.widget.FrameLayout; | 25 import android.widget.FrameLayout; |
33 | 26 |
34 import org.hamcrest.CoreMatchers; | 27 import org.hamcrest.CoreMatchers; |
35 import org.junit.Before; | 28 import org.junit.Before; |
36 import org.junit.Rule; | 29 import org.junit.Rule; |
37 import org.junit.Test; | 30 import org.junit.Test; |
38 import org.junit.runner.RunWith; | 31 import org.junit.runner.RunWith; |
39 import org.mockito.ArgumentCaptor; | 32 import org.mockito.ArgumentCaptor; |
40 import org.mockito.Mock; | 33 import org.mockito.Mock; |
41 import org.mockito.MockitoAnnotations; | 34 import org.mockito.MockitoAnnotations; |
42 import org.mockito.invocation.InvocationOnMock; | 35 import org.mockito.invocation.InvocationOnMock; |
43 import org.mockito.stubbing.Answer; | 36 import org.mockito.stubbing.Answer; |
44 import org.robolectric.RuntimeEnvironment; | 37 import org.robolectric.RuntimeEnvironment; |
45 import org.robolectric.annotation.Config; | 38 import org.robolectric.annotation.Config; |
46 import org.robolectric.annotation.Implementation; | |
47 import org.robolectric.annotation.Implements; | |
48 import org.robolectric.shadows.ShadowResources; | |
49 | 39 |
50 import org.chromium.base.Callback; | 40 import org.chromium.base.Callback; |
51 import org.chromium.chrome.R; | |
52 import org.chromium.chrome.browser.ChromeFeatureList; | 41 import org.chromium.chrome.browser.ChromeFeatureList; |
53 import org.chromium.chrome.browser.Features; | 42 import org.chromium.chrome.browser.Features; |
54 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; | 43 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; |
55 import org.chromium.chrome.browser.ntp.ContextMenuManager; | 44 import org.chromium.chrome.browser.ntp.ContextMenuManager; |
56 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; | 45 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; |
57 import org.chromium.testing.local.LocalRobolectricTestRunner; | 46 import org.chromium.testing.local.LocalRobolectricTestRunner; |
58 | 47 |
59 /** | 48 /** |
60 * Unit tests for {@link TileGroup}. | 49 * Unit tests for {@link TileGroup}. |
61 */ | 50 */ |
62 @RunWith(LocalRobolectricTestRunner.class) | 51 @RunWith(LocalRobolectricTestRunner.class) |
63 @Config(manifest = Config.NONE, sdk = 21, | 52 @Config(manifest = Config.NONE) |
64 shadows = {TileGroupTest.TileShadowResources.class, | |
65 TileGroupTest.ShadowLayoutInflater.class}) | |
66 @Features(@Features.Register(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) | 53 @Features(@Features.Register(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) |
67 public class TileGroupTest { | 54 public class TileGroupTest { |
68 private static final int MAX_TILES_TO_FETCH = 4; | 55 private static final int MAX_TILES_TO_FETCH = 4; |
69 private static final int TILE_TITLE_LINES = 1; | 56 private static final int TILE_TITLE_LINES = 1; |
70 private static final String[] URLS = {"https://www.google.com", "https://tel
lmedadjokes.com"}; | 57 private static final String[] URLS = {"https://www.google.com", "https://tel
lmedadjokes.com"}; |
71 | 58 |
72 @Rule | 59 @Rule |
73 public Features.Processor mFeaturesProcessor = new Features.Processor(); | 60 public Features.Processor mFeaturesProcessor = new Features.Processor(); |
74 | 61 |
75 @Mock | 62 @Mock |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 MostVisitedSites.Observer observer, int maxResults) { | 410 MostVisitedSites.Observer observer, int maxResults) { |
424 mObserver = observer; | 411 mObserver = observer; |
425 } | 412 } |
426 | 413 |
427 @Override | 414 @Override |
428 public void onLoadingComplete(Tile[] tiles) {} | 415 public void onLoadingComplete(Tile[] tiles) {} |
429 | 416 |
430 @Override | 417 @Override |
431 public void destroy() {} | 418 public void destroy() {} |
432 } | 419 } |
433 | |
434 /** | |
435 * Replacement for the {@link Resources} to allow loading resources used by
{@link TileGroup} in | |
436 * unit tests. | |
437 * TODO(https://crbug.com/693573): Needed until unit tests can pick up resou
rces themselves. | |
438 */ | |
439 @Implements(Resources.class) | |
440 public static class TileShadowResources extends ShadowResources { | |
441 @Implementation | |
442 public int getDimensionPixelSize(@DimenRes int id) { | |
443 if (id == R.dimen.tile_view_icon_size) return 48; | |
444 | |
445 throw new IllegalArgumentException(); | |
446 } | |
447 | |
448 @Implementation | |
449 public int getColor(@ColorRes int id) { | |
450 if (id == R.color.default_favicon_background_color) return Color.BLA
CK; | |
451 | |
452 throw new IllegalArgumentException(); | |
453 } | |
454 } | |
455 | |
456 /** Intercepts calls to inflate views to replace them with mocks. */ | |
457 @Implements(LayoutInflater.class) | |
458 public static class ShadowLayoutInflater { | |
459 @Implementation | |
460 public static LayoutInflater from(Context context) { | |
461 LayoutInflater layoutInflater = mock(LayoutInflater.class); | |
462 when(layoutInflater.inflate(anyInt(), any(ViewGroup.class), anyBoole
an())) | |
463 .thenAnswer(new Answer<View>() { | |
464 @Override | |
465 public View answer(InvocationOnMock invocation) throws T
hrowable { | |
466 @LayoutRes | |
467 int layoutId = invocation.getArgument(0); | |
468 if (layoutId != R.layout.tile_view) fail("Unexpected
resource id."); | |
469 return createMockTileView(); | |
470 } | |
471 }); | |
472 return layoutInflater; | |
473 } | |
474 } | |
475 } | 420 } |
OLD | NEW |