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; |
10 import static org.mockito.ArgumentMatchers.any; | 11 import static org.mockito.ArgumentMatchers.any; |
11 import static org.mockito.ArgumentMatchers.anyBoolean; | 12 import static org.mockito.ArgumentMatchers.anyBoolean; |
12 import static org.mockito.ArgumentMatchers.anyInt; | 13 import static org.mockito.ArgumentMatchers.anyInt; |
13 import static org.mockito.Mockito.doAnswer; | 14 import static org.mockito.Mockito.doAnswer; |
14 import static org.mockito.Mockito.mock; | 15 import static org.mockito.Mockito.mock; |
15 import static org.mockito.Mockito.never; | 16 import static org.mockito.Mockito.never; |
16 import static org.mockito.Mockito.reset; | 17 import static org.mockito.Mockito.reset; |
17 import static org.mockito.Mockito.verify; | 18 import static org.mockito.Mockito.verify; |
18 import static org.mockito.Mockito.verifyNoMoreInteractions; | 19 import static org.mockito.Mockito.verifyNoMoreInteractions; |
19 import static org.mockito.Mockito.when; | 20 import static org.mockito.Mockito.when; |
20 | 21 |
| 22 import android.content.Context; |
| 23 import android.content.res.Resources; |
21 import android.graphics.Bitmap; | 24 import android.graphics.Bitmap; |
22 import android.graphics.Color; | 25 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; |
23 import android.view.View; | 30 import android.view.View; |
24 import android.view.ViewGroup; | 31 import android.view.ViewGroup; |
25 import android.widget.FrameLayout; | 32 import android.widget.FrameLayout; |
26 | 33 |
27 import org.hamcrest.CoreMatchers; | 34 import org.hamcrest.CoreMatchers; |
28 import org.junit.Before; | 35 import org.junit.Before; |
29 import org.junit.Rule; | 36 import org.junit.Rule; |
30 import org.junit.Test; | 37 import org.junit.Test; |
31 import org.junit.runner.RunWith; | 38 import org.junit.runner.RunWith; |
32 import org.mockito.ArgumentCaptor; | 39 import org.mockito.ArgumentCaptor; |
33 import org.mockito.Mock; | 40 import org.mockito.Mock; |
34 import org.mockito.MockitoAnnotations; | 41 import org.mockito.MockitoAnnotations; |
35 import org.mockito.invocation.InvocationOnMock; | 42 import org.mockito.invocation.InvocationOnMock; |
36 import org.mockito.stubbing.Answer; | 43 import org.mockito.stubbing.Answer; |
37 import org.robolectric.RuntimeEnvironment; | 44 import org.robolectric.RuntimeEnvironment; |
38 import org.robolectric.annotation.Config; | 45 import org.robolectric.annotation.Config; |
| 46 import org.robolectric.annotation.Implementation; |
| 47 import org.robolectric.annotation.Implements; |
| 48 import org.robolectric.shadows.ShadowResources; |
39 | 49 |
40 import org.chromium.base.Callback; | 50 import org.chromium.base.Callback; |
| 51 import org.chromium.chrome.R; |
41 import org.chromium.chrome.browser.ChromeFeatureList; | 52 import org.chromium.chrome.browser.ChromeFeatureList; |
42 import org.chromium.chrome.browser.Features; | 53 import org.chromium.chrome.browser.Features; |
43 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; | 54 import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback; |
44 import org.chromium.chrome.browser.ntp.ContextMenuManager; | 55 import org.chromium.chrome.browser.ntp.ContextMenuManager; |
45 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; | 56 import org.chromium.chrome.browser.offlinepages.OfflinePageBridge; |
46 import org.chromium.testing.local.LocalRobolectricTestRunner; | 57 import org.chromium.testing.local.LocalRobolectricTestRunner; |
47 | 58 |
48 /** | 59 /** |
49 * Unit tests for {@link TileGroup}. | 60 * Unit tests for {@link TileGroup}. |
50 */ | 61 */ |
51 @RunWith(LocalRobolectricTestRunner.class) | 62 @RunWith(LocalRobolectricTestRunner.class) |
52 @Config(manifest = Config.NONE) | 63 @Config(manifest = Config.NONE, sdk = 21, |
| 64 shadows = {TileGroupTest.TileShadowResources.class, |
| 65 TileGroupTest.ShadowLayoutInflater.class}) |
53 @Features(@Features.Register(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) | 66 @Features(@Features.Register(ChromeFeatureList.NTP_OFFLINE_PAGES_FEATURE_NAME)) |
54 public class TileGroupTest { | 67 public class TileGroupTest { |
55 private static final int MAX_TILES_TO_FETCH = 4; | 68 private static final int MAX_TILES_TO_FETCH = 4; |
56 private static final int TILE_TITLE_LINES = 1; | 69 private static final int TILE_TITLE_LINES = 1; |
57 private static final String[] URLS = {"https://www.google.com", "https://tel
lmedadjokes.com"}; | 70 private static final String[] URLS = {"https://www.google.com", "https://tel
lmedadjokes.com"}; |
58 | 71 |
59 @Rule | 72 @Rule |
60 public Features.Processor mFeaturesProcessor = new Features.Processor(); | 73 public Features.Processor mFeaturesProcessor = new Features.Processor(); |
61 | 74 |
62 @Mock | 75 @Mock |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
410 MostVisitedSites.Observer observer, int maxResults) { | 423 MostVisitedSites.Observer observer, int maxResults) { |
411 mObserver = observer; | 424 mObserver = observer; |
412 } | 425 } |
413 | 426 |
414 @Override | 427 @Override |
415 public void onLoadingComplete(Tile[] tiles) {} | 428 public void onLoadingComplete(Tile[] tiles) {} |
416 | 429 |
417 @Override | 430 @Override |
418 public void destroy() {} | 431 public void destroy() {} |
419 } | 432 } |
| 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 } |
420 } | 475 } |
OLD | NEW |