/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.views.image; import android.graphics.Color; import android.util.DisplayMetrics; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.react.bridge.CatalystInstance; import com.facebook.react.bridge.JavaOnlyArray; import com.facebook.react.bridge.ReactTestHelper; import com.facebook.react.bridge.JSApplicationIllegalArgumentException; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.JavaOnlyMap; import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.ThemedReactContext; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.Rule; import org.junit.runner.RunWith; import org.powermock.modules.junit4.rule.PowerMockRule; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.Robolectric; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; /** * Verify that {@link ScalingUtils} properties are being applied correctly * by {@link ReactImageManager}. */ @RunWith(RobolectricTestRunner.class) @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) public class ReactImagePropertyTest { @Rule public PowerMockRule rule = new PowerMockRule(); private ReactApplicationContext mContext; private CatalystInstance mCatalystInstanceMock; private ThemedReactContext mThemeContext; @Before public void setup() { mContext = new ReactApplicationContext(RuntimeEnvironment.application); mCatalystInstanceMock = ReactTestHelper.createMockCatalystInstance(); mContext.initializeWithInstance(mCatalystInstanceMock); mThemeContext = new ThemedReactContext(mContext, mContext); Fresco.initialize(mContext); DisplayMetricsHolder.setWindowDisplayMetrics(new DisplayMetrics()); } @After public void teardown() { DisplayMetricsHolder.setWindowDisplayMetrics(null); } public ReactStylesDiffMap buildStyles(Object... keysAndValues) { return new ReactStylesDiffMap(JavaOnlyMap.of(keysAndValues)); } @Test(expected=JSApplicationIllegalArgumentException.class) public void testImageInvalidResizeMode() { ReactImageManager viewManager = new ReactImageManager(); ReactImageView view = viewManager.createViewInstance(mThemeContext); viewManager.updateProperties(view, buildStyles("resizeMode", "pancakes")); } @Test public void testBorderColor() { ReactImageManager viewManager = new ReactImageManager(); ReactImageView view = viewManager.createViewInstance(mThemeContext); viewManager.updateProperties( view, buildStyles("src", JavaOnlyArray.of(JavaOnlyMap.of("uri", "http://mysite.com/mypic.jpg")))); viewManager.updateProperties(view, buildStyles("borderColor", Color.argb(0, 0, 255, 255))); int borderColor = view.getHierarchy().getRoundingParams().getBorderColor(); assertEquals(0, Color.alpha(borderColor)); assertEquals(0, Color.red(borderColor)); assertEquals(255, Color.green(borderColor)); assertEquals(255, Color.blue(borderColor)); viewManager.updateProperties(view, buildStyles("borderColor", Color.argb(0, 255, 50, 128))); borderColor = view.getHierarchy().getRoundingParams().getBorderColor(); assertEquals(0, Color.alpha(borderColor)); assertEquals(255, Color.red(borderColor)); assertEquals(50, Color.green(borderColor)); assertEquals(128, Color.blue(borderColor)); viewManager.updateProperties(view, buildStyles("borderColor", null)); borderColor = view.getHierarchy().getRoundingParams().getBorderColor(); assertEquals(0, Color.alpha(borderColor)); assertEquals(0, Color.red(borderColor)); assertEquals(0, Color.green(borderColor)); assertEquals(0, Color.blue(borderColor)); } @Test public void testRoundedCorners() { ReactImageManager viewManager = new ReactImageManager(); ReactImageView view = viewManager.createViewInstance(mThemeContext); viewManager.updateProperties( view, buildStyles("src", JavaOnlyArray.of(JavaOnlyMap.of("uri", "http://mysite.com/mypic.jpg")))); // We can't easily verify if rounded corner was honored or not, this tests simply verifies // we're not crashing.. viewManager.updateProperties(view, buildStyles("borderRadius", (double) 10)); viewManager.updateProperties(view, buildStyles("borderRadius", (double) 0)); viewManager.updateProperties(view, buildStyles("borderRadius", null)); } @Test public void testTintColor() { ReactImageManager viewManager = new ReactImageManager(); ReactImageView view = viewManager.createViewInstance(mThemeContext); assertNull(view.getColorFilter()); viewManager.updateProperties(view, buildStyles("tintColor", Color.argb(50, 0, 0, 255))); // Can't actually assert the specific color so this is the next best thing. // Does the color filter now exist? assertNotNull(view.getColorFilter()); viewManager.updateProperties(view, buildStyles("tintColor", null)); assertNull(view.getColorFilter()); } }