[general] moving ios and android project under ./platform folder

This commit is contained in:
Petr Pokorny
2020-12-20 12:38:56 +01:00
parent 8e759a51e4
commit 41f0be34e7
9877 changed files with 141 additions and 2889 deletions

View File

@@ -0,0 +1,2 @@
lint-baseline.xml
lint/lint-baseline-local.xml

View File

@@ -0,0 +1,11 @@
# Mapbox GL Test App
## Building
To be able to run any Gradle commands, you'll need to create the configuration file by running
```
$ make android-configuration
```
from the root folder.

View File

@@ -0,0 +1,93 @@
apply plugin: 'com.android.application'
apply from: "${rootDir}/gradle/native-build.gradle"
android {
compileSdkVersion androidVersions.compileSdkVersion
defaultConfig {
applicationId "com.mapbox.mapboxsdk.testapp"
minSdkVersion androidVersions.minSdkVersion
targetSdkVersion androidVersions.targetSdkVersion
versionCode 13
versionName "6.0.0"
testInstrumentationRunner "com.mapbox.mapboxsdk.InstrumentationRunner"
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
nativeBuild(["example-custom-layer"])
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'LICENSE.txt'
}
lintOptions {
baseline file("lint-baseline-local.xml")
checkAllWarnings true
warningsAsErrors true
disable 'MissingTranslation', 'GoogleAppIndexingWarning', 'UnpackedNativeCode', 'IconDipSize', 'TypographyQuotes'
abortOnError false
}
buildTypes {
debug {
testCoverageEnabled true
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
dexOptions {
maxProcessCount 8
javaMaxHeapSize "2g"
preDexLibraries true
}
}
dependencies {
implementation dependenciesList.kotlinLib
implementation project(':MapboxGLAndroidSDK')
implementation dependenciesList.mapboxJavaTurf
implementation dependenciesList.supportAppcompatV7
implementation dependenciesList.supportRecyclerView
implementation dependenciesList.supportDesign
implementation dependenciesList.supportConstraintLayout
implementation dependenciesList.gmsLocation
implementation dependenciesList.timber
debugImplementation dependenciesList.leakCanaryDebug
releaseImplementation dependenciesList.leakCanaryRelease
androidTestImplementation dependenciesList.supportAnnotations
androidTestImplementation dependenciesList.testRunner
androidTestImplementation dependenciesList.testRules
androidTestImplementation dependenciesList.testEspressoCore
androidTestImplementation dependenciesList.testEspressoIntents
androidTestImplementation dependenciesList.testEspressoContrib
androidTestImplementation dependenciesList.testUiAutomator
androidTestImplementation dependenciesList.appCenter
}
apply from: "${rootDir}/gradle/gradle-make.gradle"
apply from: "${rootDir}/gradle/gradle-config.gradle"
apply from: "${rootDir}/gradle/gradle-checkstyle.gradle"
apply from: "${rootDir}/gradle/gradle-lint.gradle"
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8"?>
<issues format="4" by="lint 2.3.1">
<issue
id="UnusedResources"
message="The resource `R.string.mapbox_access_token` appears to be unused"
errorLine1=" &lt;string name=&quot;mapbox_access_token&quot;>YOUR_MAPBOX_ACCESS_TOKEN_GOES_HERE&lt;/string>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/values/developer-config.xml"
line="3"
column="13"/>
</issue>
<issue
id="Overdraw"
message="Possible overdraw: Root element paints background `#cccc` with a theme that also paints a background (inferred theme is `@style/AppTheme`)"
errorLine1=" android:background=&quot;#cccc&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/layout/drawer_navigation_drawer.xml"
line="4"
column="5"/>
</issue>
<issue
id="Overdraw"
message="Possible overdraw: Root element paints background `?android:attr/selectableItemBackground` with a theme that also paints a background (inferred theme is `@style/AppTheme`)"
errorLine1=" android:background=&quot;?android:attr/selectableItemBackground&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/layout/item_main_feature.xml"
line="6"
column="5"/>
</issue>
<issue
id="Overdraw"
message="Possible overdraw: Root element paints background `@color/mapboxGreen` with a theme that also paints a background (inferred theme is `@style/AppTheme`)"
errorLine1=" android:background=&quot;@color/mapboxGreen&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/res/layout/view_text_marker.xml"
line="5"
column="5"/>
</issue>
<issue
id="TypographyQuotes"
message="Replace straight quotes (&apos;&apos;) with directional quotes (‘’, &amp;#8216; and &amp;#8217;) ?"
errorLine1=" &lt;string name=&quot;mapbox_attributionTelemetryMessage&quot;>Estàs ajudant a millorar els mapes d\&apos;OpenStreetMap i de Mapbox aportant dades d\&apos;ús anònimes.&lt;/string>"
errorLine2=" ^">
<location
file="src/main/res/values-ca/strings.xml"
line="9"
column="55"/>
</issue>
<issue
id="IconDuplicatesConfig"
message="The `icon_burned.png` icon has identical contents in the following configuration folders: drawable-hdpi, drawable-xhdpi">
<location
file="src/main/res/drawable-xhdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-hdpi/icon_burned.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-hdpi/ic_launcher_round.png`: expected 72x72, but was 216x216">
<location
file="src/main/res/drawable-hdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-mdpi/ic_launcher_round.png`: expected 48x48, but was 144x144">
<location
file="src/main/res/drawable-mdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xhdpi/ic_launcher_round.png`: expected 96x96, but was 288x288">
<location
file="src/main/res/drawable-xhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxhdpi/ic_launcher_round.png`: expected 144x144, but was 432x432">
<location
file="src/main/res/drawable-xxhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxxhdpi/ic_launcher_round.png`: expected 192x192, but was 576x576">
<location
file="src/main/res/drawable-xxxhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-hdpi/icon.png`: expected 72x72, but was 215x212">
<location
file="src/main/res/drawable-hdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-mdpi/icon.png`: expected 48x48, but was 143x141">
<location
file="src/main/res/drawable-mdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xhdpi/icon.png`: expected 96x96, but was 286x282">
<location
file="src/main/res/drawable-xhdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxhdpi/icon.png`: expected 144x144, but was 429x423">
<location
file="src/main/res/drawable-xxhdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxxhdpi/icon.png`: expected 192x192, but was 572x564">
<location
file="src/main/res/drawable-xxxhdpi/icon.png"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-hdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png, southeast_radar_0.png, southeast_radar_1.png... (2 more)">
<location
file="src/main/res/drawable-hdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-mdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png">
<location
file="src/main/res/drawable-mdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-xhdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png, southeast_radar_0.png, southeast_radar_1.png... (2 more)">
<location
file="src/main/res/drawable-xhdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-xxhdpi`: ic_car_top.png, ic_taxi_top.png, southeast_radar_0.png, southeast_radar_1.png, southeast_radar_2.png... (1 more)">
<location
file="src/main/res/drawable-xxhdpi"/>
</issue>
</issues>

View File

@@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- REMEMBER! First you run Lint locally you'll need to move lint-baseline-local.xml.xml file
generated into the lint folder and called it lint-baseline-local.xml
If you remove any error when running Lint locally, you'll get a warning from the command
line advising you to remove it from the baseline. If you remove it (remember to remove it
from lint-baseline-local.xml file) you should remove it too from
lint-baseline-ci.xml (THIS FILE) which is the only one included in the repo.
Eventually, it'll be removed (when we remove all current lint errors included). -->
<issues by="lint 2.3.1" format="4">
<issue
errorLine1=" android:background=&quot;#cccc&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"
id="Overdraw"
message="Possible overdraw: Root element paints background `#cccc` with a theme that also paints a background (inferred theme is `@style/AppTheme`)">
<location
column="5"
file="src/main/res/layout/drawer_navigation_drawer.xml"
line="4"/>
</issue>
<issue
errorLine1=" android:background=&quot;?android:attr/selectableItemBackground&quot;"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
id="Overdraw"
message="Possible overdraw: Root element paints background `?android:attr/selectableItemBackground` with a theme that also paints a background (inferred theme is `@style/AppTheme`)">
<location
column="5"
file="src/main/res/layout/item_main_feature.xml"
line="6"/>
</issue>
<issue
errorLine1=" android:background=&quot;@color/mapboxGreen&quot;>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
id="Overdraw"
message="Possible overdraw: Root element paints background `@color/mapboxGreen` with a theme that also paints a background (inferred theme is `@style/AppTheme`)">
<location
column="5"
file="src/main/res/layout/view_text_marker.xml"
line="5"/>
</issue>
<issue
errorLine1=" &lt;string name=&quot;mapbox_attributionTelemetryMessage&quot;>Estàs ajudant a millorar els mapes d\&apos;OpenStreetMap i de Mapbox aportant dades d\&apos;ús anònimes.&lt;/string>"
errorLine2=" ^"
id="TypographyQuotes"
message="Replace straight quotes (&apos;&apos;) with directional quotes (‘’, &amp;#8216; and &amp;#8217;) ?">
<location
column="55"
file="src/main/res/values-ca/strings.xml"
line="9"/>
</issue>
<issue
id="IconDipSize"
message="The image `icon_burned.png` varies significantly in its density-independent (dip) size across the various density versions: drawable-hdpi/icon_burned.png: 64x64 dp (96x96 px), drawable-xxxhdpi/icon_burned.png: 48x48 dp (192x192 px), drawable-xxhdpi/icon_burned.png: 48x48 dp (144x144 px), drawable-xhdpi/icon_burned.png: 48x48 dp (96x96 px), drawable-mdpi/icon_burned.png: 48x48 dp (48x48 px)">
<location
file="src/main/res/drawable-mdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-xhdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-xxhdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-xxxhdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-hdpi/icon_burned.png"/>
</issue>
<issue
id="IconDuplicatesConfig"
message="The `icon_burned.png` icon has identical contents in the following configuration folders: drawable-hdpi, drawable-xhdpi">
<location
file="src/main/res/drawable-xhdpi/icon_burned.png"/>
<location
file="src/main/res/drawable-hdpi/icon_burned.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-hdpi/ic_launcher_round.png`: expected 72x72, but was 216x216">
<location
file="src/main/res/drawable-hdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-mdpi/ic_launcher_round.png`: expected 48x48, but was 144x144">
<location
file="src/main/res/drawable-mdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xhdpi/ic_launcher_round.png`: expected 96x96, but was 288x288">
<location
file="src/main/res/drawable-xhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxhdpi/ic_launcher_round.png`: expected 144x144, but was 432x432">
<location
file="src/main/res/drawable-xxhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxxhdpi/ic_launcher_round.png`: expected 192x192, but was 576x576">
<location
file="src/main/res/drawable-xxxhdpi/ic_launcher_round.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-hdpi/icon.png`: expected 72x72, but was 215x212">
<location
file="src/main/res/drawable-hdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-mdpi/icon.png`: expected 48x48, but was 143x141">
<location
file="src/main/res/drawable-mdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xhdpi/icon.png`: expected 96x96, but was 286x282">
<location
file="src/main/res/drawable-xhdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxhdpi/icon.png`: expected 144x144, but was 429x423">
<location
file="src/main/res/drawable-xxhdpi/icon.png"/>
</issue>
<issue
id="IconExpectedSize"
message="Incorrect icon size for `drawable-xxxhdpi/icon.png`: expected 192x192, but was 572x564">
<location
file="src/main/res/drawable-xxxhdpi/icon.png"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-hdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png, southeast_radar_0.png, southeast_radar_1.png... (2 more)">
<location
file="src/main/res/drawable-hdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-mdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png">
<location
file="src/main/res/drawable-mdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-xhdpi`: ic_car_top.png, ic_taxi_top.png, ic_us.png, southeast_radar_0.png, southeast_radar_1.png... (2 more)">
<location
file="src/main/res/drawable-xhdpi"/>
</issue>
<issue
id="IconDensities"
message="Missing the following drawables in `drawable-xxhdpi`: ic_car_top.png, ic_taxi_top.png, southeast_radar_0.png, southeast_radar_1.png, southeast_radar_2.png... (1 more)">
<location
file="src/main/res/drawable-xxhdpi"/>
</issue>
</issues>

View File

@@ -0,0 +1,14 @@
# Mapbox ProGuard configuration is handled in the SDK,
# This file contains test app specific configuration
# Kotlin
-dontnote kotlin.**
# LeakCanary
-dontnote com.squareup.leakcanary.internal.**
-dontnote gnu.trove.THashMap
# GMS
-dontnote com.google.android.gms.**
-keep class com.mapbox.mapboxsdk.testapp.model.customlayer.ExampleCustomLayer { *; }

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:tools="http://schemas.android.com/tools" package="${applicationId}">
<uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator"/>
</manifest>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,15 @@
package com.mapbox.mapboxsdk
import com.microsoft.appcenter.espresso.Factory
import org.junit.After
import org.junit.Rule
abstract class AppCenter {
@get:Rule
var reportHelper = Factory.getReportHelper()!!
@After
open fun afterTest() {
reportHelper.label(javaClass.simpleName)
}
}

View File

@@ -0,0 +1,10 @@
package com.mapbox.mapboxsdk
import com.mapbox.mapboxsdk.testapp.MapboxApplication
class InstrumentationApplication : MapboxApplication() {
override fun initializeLeakCanary(): Boolean {
// do not initialize leak canary during instrumentation tests
return true
}
}

View File

@@ -0,0 +1,11 @@
package com.mapbox.mapboxsdk
import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner
class InstrumentationRunner : AndroidJUnitRunner() {
override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
return super.newApplication(cl, InstrumentationApplication::class.java.name, context)
}
}

View File

@@ -0,0 +1,186 @@
package com.mapbox.mapboxsdk.camera
import android.graphics.PointF
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.geometry.LatLngBounds
import com.mapbox.mapboxsdk.testapp.activity.BaseTest
import com.mapbox.mapboxsdk.testapp.activity.espresso.DeviceIndependentTestActivity
import org.junit.Assert
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class CameraUpdateFactoryTest : BaseTest() {
override fun getActivityClass(): Class<*> {
return DeviceIndependentTestActivity::class.java
}
@Test
@UiThreadTest
fun testLatLngBoundsUntiltedUnrotated() {
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(LatLng(60.0, 24.0))
.bearing(0.0)
.tilt(0.0)
.build()
val bounds: LatLngBounds = LatLngBounds.Builder()
.include(LatLng(62.0, 26.0))
.include(LatLng(58.0, 22.0))
.build()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0))
val cameraPosition = mapboxMap.cameraPosition
assertEquals("latitude should match:", 60.0, cameraPosition.target.latitude, 0.1)
assertEquals("longitude should match:", 24.0, cameraPosition.target.longitude, 0.1)
assertEquals("bearing should match:", 0.0, cameraPosition.bearing, 0.1)
assertEquals("zoom should match", 5.5, cameraPosition.zoom, 0.1)
assertEquals("tilt should match:", 0.0, cameraPosition.tilt, 0.1)
}
@Test
@UiThreadTest
fun testLatLngBoundsTilted() {
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(LatLng(60.0, 24.0))
.bearing(0.0)
.tilt(45.0)
.build()
val bounds: LatLngBounds = LatLngBounds.Builder()
.include(LatLng(62.0, 26.0))
.include(LatLng(58.0, 22.0))
.build()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0))
val cameraPosition = mapboxMap.cameraPosition
assertEquals("latitude should match:", 60.0, cameraPosition.target.latitude, 0.1)
assertEquals("longitude should match:", 24.0, cameraPosition.target.longitude, 0.1)
assertEquals("bearing should match:", 0.0, cameraPosition.bearing, 0.1)
assertEquals("zoom should match", 6.0, cameraPosition.zoom, 0.1)
assertEquals("tilt should match:", 45.0, cameraPosition.tilt, 0.1)
}
@Test
@UiThreadTest
fun testLatLngBoundsRotated() {
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(LatLng(60.0, 24.0))
.bearing(30.0)
.tilt(0.0)
.build()
val bounds: LatLngBounds = LatLngBounds.Builder()
.include(LatLng(62.0, 26.0))
.include(LatLng(58.0, 22.0))
.build()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0))
val cameraPosition = mapboxMap.cameraPosition
assertEquals("latitude should match:", 60.0, cameraPosition.target.latitude, 0.1)
assertEquals("longitude should match:", 24.0, cameraPosition.target.longitude, 0.1)
assertEquals("bearing should match:", 30.0, cameraPosition.bearing, 0.1)
assertEquals("zoom should match", 5.3, cameraPosition.zoom, 0.1)
assertEquals("tilt should match:", 0.0, cameraPosition.tilt, 0.1)
}
@Test
@UiThreadTest
fun testLatLngBoundsTiltedRotated() {
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(LatLng(60.0, 24.0))
.bearing(30.0)
.tilt(45.0)
.build()
val bounds: LatLngBounds = LatLngBounds.Builder()
.include(LatLng(62.0, 26.0))
.include(LatLng(58.0, 22.0))
.build()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0))
val cameraPosition = mapboxMap.cameraPosition
assertEquals("latitude should match:", 60.0, cameraPosition.target.latitude, 0.1)
assertEquals("longitude should match:", 24.0, cameraPosition.target.longitude, 0.1)
assertEquals("bearing should match:", 30.0, cameraPosition.bearing, 0.1)
assertEquals("zoom should match", 5.6, cameraPosition.zoom, 0.1)
assertEquals("tilt should match:", 45.0, cameraPosition.tilt, 0.1)
}
@Test
@UiThreadTest
fun testLatLngBoundsWithProvidedTiltAndRotation() {
mapboxMap.cameraPosition = CameraPosition.Builder()
.target(LatLng(60.0, 24.0))
.bearing(0.0)
.tilt(0.0)
.build()
val bounds: LatLngBounds = LatLngBounds.Builder()
.include(LatLng(62.0, 26.0))
.include(LatLng(58.0, 22.0))
.build()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 30.0, 40.0, 0))
val cameraPosition = mapboxMap.cameraPosition
assertEquals("latitude should match:", 60.0, cameraPosition.target.latitude, 0.1)
assertEquals("longitude should match:", 24.0, cameraPosition.target.longitude, 0.1)
assertEquals("bearing should match:", 30.0, cameraPosition.bearing, 0.1)
assertEquals("zoom should match", 5.6, cameraPosition.zoom, 0.1)
assertEquals("tilt should match:", 40.0, cameraPosition.tilt, 0.1)
}
@Test
@UiThreadTest
fun withPadding_cameraInvalidated_paddingPersisting() {
val initialCameraPosition = mapboxMap.cameraPosition
val initialPoint = mapboxMap.projection.toScreenLocation(initialCameraPosition.target)
val bottomPadding = mapView.height / 4
val leftPadding = mapView.width / 4
val padding = doubleArrayOf(leftPadding.toDouble(), 0.0, 0.0, bottomPadding.toDouble())
mapboxMap.moveCamera(CameraUpdateFactory.paddingTo(leftPadding.toDouble(), 0.0, 0.0, bottomPadding.toDouble()))
Assert.assertArrayEquals(intArrayOf(leftPadding, 0, 0, bottomPadding), mapboxMap.padding)
val resultingCameraPosition = mapboxMap.cameraPosition
assertEquals(initialCameraPosition.target, resultingCameraPosition.target)
assertEquals(
PointF(initialPoint.x + leftPadding / 2, initialPoint.y - bottomPadding / 2),
mapboxMap.projection.toScreenLocation(resultingCameraPosition.target)
)
Assert.assertArrayEquals(padding, resultingCameraPosition.padding, 0.0001)
}
@Test
@UiThreadTest
fun withLatLngPadding_cameraInvalidated_paddingPersisting() {
val expectedTarget = LatLng(2.0, 2.0)
val topPadding = mapView.height / 4
val rightPadding = mapView.width / 4
val padding = doubleArrayOf(0.0, topPadding.toDouble(), rightPadding.toDouble(), 0.0)
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngPadding(expectedTarget, 0.0, topPadding.toDouble(), rightPadding.toDouble(), 0.0))
Assert.assertArrayEquals(intArrayOf(0, topPadding, rightPadding, 0), mapboxMap.padding)
val resultingCameraPosition = mapboxMap.cameraPosition
assertEquals(expectedTarget.latitude, resultingCameraPosition.target.latitude, 0.1)
assertEquals(expectedTarget.longitude, resultingCameraPosition.target.longitude, 0.1)
val centerLatLng = mapboxMap.projection.fromScreenLocation(PointF((mapView.width / 2).toFloat(), (mapView.height / 2).toFloat()))
assertTrue(centerLatLng.latitude > resultingCameraPosition.target.latitude)
assertTrue(centerLatLng.longitude > resultingCameraPosition.target.longitude)
Assert.assertArrayEquals(padding, resultingCameraPosition.padding, 0.0001)
}
}

View File

@@ -0,0 +1,40 @@
package com.mapbox.mapboxsdk.integration
import android.content.Context
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.*
import com.mapbox.mapboxsdk.AppCenter
import org.junit.Before
const val TIMEOUT_UI_SEARCH_WAIT = 5000L
abstract class BaseIntegrationTest : AppCenter() {
protected lateinit var device: UiDevice
@Before
open fun beforeTest() {
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
}
}
/**
* Launches an activity with FLAG_ACTIVITY_NEW_TASK.
* <p>
* To resume an activity, you need to add a single instance launchmode to your manifest configuration.
* <p>
*/
fun UiDevice.launchActivity(context: Context, clazz: Class<*>) {
val applicationPackage = InstrumentationRegistry.getInstrumentation().targetContext.packageName
val intent = Intent(context, clazz)
intent.addFlags(FLAG_ACTIVITY_NEW_TASK)
InstrumentationRegistry.getInstrumentation().context.startActivity(intent)
wait(Until.hasObject(By.pkg(applicationPackage).depth(0)), TIMEOUT_UI_SEARCH_WAIT)
}
fun UiDevice.scrollRecyclerViewTo(recycleItem: String) {
val appView = UiScrollable(UiSelector().scrollable(true))
appView.scrollIntoView(UiSelector().text(recycleItem))
}

View File

@@ -0,0 +1,45 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiSelector
import com.mapbox.mapboxsdk.testapp.activity.fragment.FragmentBackStackActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates MapFragment integration on the backstack
*/
@RunWith(AndroidJUnit4::class)
class FragmentBackStackTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<FragmentBackStackActivity> = ActivityTestRule(FragmentBackStackActivity::class.java)
@Test
@LargeTest
fun backPressedOnBackStackResumed() {
device.waitForIdle()
clickReplaceFragmentButton()
device.pressHome()
device.waitForIdle()
device.launchActivity(activityRule.activity.applicationContext, FragmentBackStackActivity::class.java)
backPressBackStack()
device.waitForIdle()
}
private fun clickReplaceFragmentButton() {
device.findObject(UiSelector().description(textDescription)).click()
}
private fun backPressBackStack() {
device.pressBack() // pops fragment, showing map
device.pressBack() // finish activity
}
private companion object {
const val textDescription = "btn_change_fragment"
}
}

View File

@@ -0,0 +1,29 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.maplayout.SimpleMapActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates reopening an Activity with a GLSurfaceView
*/
@RunWith(AndroidJUnit4::class)
class GLSurfaceViewReopenTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<SimpleMapActivity> = ActivityTestRule(SimpleMapActivity::class.java)
@Test
@LargeTest
fun reopenSimpleMapActivity() {
device.waitForIdle()
device.pressHome()
device.waitForIdle()
device.launchActivity(activityRule.activity, SimpleMapActivity::class.java)
device.waitForIdle()
}
}

View File

@@ -0,0 +1,29 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.maplayout.GLSurfaceRecyclerViewActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates if a GLSurfaceView surface can be recreated without crashing.
*/
@RunWith(AndroidJUnit4::class)
class GLSurfaceViewReuseTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<GLSurfaceRecyclerViewActivity> = ActivityTestRule(GLSurfaceRecyclerViewActivity::class.java)
@Test
@LargeTest
fun scrollRecyclerView() {
device.waitForIdle()
device.scrollRecyclerViewTo("Twenty-one")
device.waitForIdle()
device.scrollRecyclerViewTo("One")
device.waitForIdle()
}
}

View File

@@ -0,0 +1,32 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.maplayout.SimpleMapActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class OrientationChangeTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<SimpleMapActivity> = ActivityTestRule(SimpleMapActivity::class.java)
@Test
@LargeTest
fun rotateSimpleMap() {
device.setOrientationLeft()
device.waitForIdle()
device.setOrientationNatural()
device.waitForIdle()
device.setOrientationRight()
device.waitForIdle()
device.setOrientationNatural()
device.setOrientationLeft()
device.setOrientationNatural()
device.setOrientationRight()
device.setOrientationNatural()
}
}

View File

@@ -0,0 +1,30 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.feature.QueryRenderedFeaturesBoxCountActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates reopening an Activity and querying the map before surface recreation #14394
*/
@RunWith(AndroidJUnit4::class)
class QueryRenderedFeaturesBoxCountTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<QueryRenderedFeaturesBoxCountActivity> =
ActivityTestRule(QueryRenderedFeaturesBoxCountActivity::class.java)
@Test
@LargeTest
fun reopenQueryRendererFeaturesActivity() {
device.waitForIdle()
device.pressHome()
device.waitForIdle()
device.launchActivity(activityRule.activity, QueryRenderedFeaturesBoxCountActivity::class.java)
device.waitForIdle()
}
}

View File

@@ -0,0 +1,29 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.textureview.TextureViewDebugModeActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates reopening an Activity with a TextureView
*/
@RunWith(AndroidJUnit4::class)
class TextureViewReopenTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<TextureViewDebugModeActivity> = ActivityTestRule(TextureViewDebugModeActivity::class.java)
@Test
@LargeTest
fun reopenTextureViewDebugActivity() {
device.waitForIdle()
device.pressHome()
device.waitForIdle()
device.launchActivity(activityRule.activity, TextureViewDebugModeActivity::class.java)
device.waitForIdle()
}
}

View File

@@ -0,0 +1,29 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.testapp.activity.maplayout.TextureRecyclerViewActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates if a GLSurfaceView surface can be recreated without crashing.
*/
@RunWith(AndroidJUnit4::class)
class TextureViewReuseTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<TextureRecyclerViewActivity> = ActivityTestRule(TextureRecyclerViewActivity::class.java)
@Test
@LargeTest
fun scrollRecyclerView() {
device.waitForIdle()
device.scrollRecyclerViewTo("Twenty-one")
device.waitForIdle()
device.scrollRecyclerViewTo("One")
device.waitForIdle()
}
}

View File

@@ -0,0 +1,36 @@
package com.mapbox.mapboxsdk.integration
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import androidx.test.uiautomator.UiSelector
import com.mapbox.mapboxsdk.testapp.activity.fragment.ViewPagerActivity
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates MapFragment integration with a ViewPager
*/
@RunWith(AndroidJUnit4::class)
class ViewPagerScrollTest : BaseIntegrationTest() {
@get:Rule
var activityRule: ActivityTestRule<ViewPagerActivity> = ActivityTestRule(ViewPagerActivity::class.java)
@Test
@LargeTest
fun scrollViewPager() {
for (i in 1..4) {
clickTab(i)
}
for (i in 3 downTo 0) {
clickTab(i)
}
}
private fun clickTab(index: Int) {
device.findObject(UiSelector().text("Page $index")).click()
}
}

View File

@@ -0,0 +1,329 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.location;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.location.LocationPropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
/**
* Basic smoke tests for LocationIndicatorLayer
*/
@RunWith(AndroidJUnit4.class)
public class LocationIndicatorLayerTest extends BaseLayerTest {
private LocationIndicatorLayer layer;
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new LocationIndicatorLayer("my-layer");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testTopImageAsConstant() {
Timber.i("top-image");
assertNotNull(layer);
assertNull(layer.getTopImage().getValue());
// Set and Get
String propertyValue = "undefined";
layer.setProperties(topImage(propertyValue));
assertEquals(layer.getTopImage().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testBearingImageAsConstant() {
Timber.i("bearing-image");
assertNotNull(layer);
assertNull(layer.getBearingImage().getValue());
// Set and Get
String propertyValue = "undefined";
layer.setProperties(bearingImage(propertyValue));
assertEquals(layer.getBearingImage().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testShadowImageAsConstant() {
Timber.i("shadow-image");
assertNotNull(layer);
assertNull(layer.getShadowImage().getValue());
// Set and Get
String propertyValue = "undefined";
layer.setProperties(shadowImage(propertyValue));
assertEquals(layer.getShadowImage().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testPerspectiveCompensationAsConstant() {
Timber.i("perspective-compensation");
assertNotNull(layer);
assertNull(layer.getPerspectiveCompensation().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(perspectiveCompensation(propertyValue));
assertEquals(layer.getPerspectiveCompensation().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testImageTiltDisplacementAsConstant() {
Timber.i("image-tilt-displacement");
assertNotNull(layer);
assertNull(layer.getImageTiltDisplacement().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(imageTiltDisplacement(propertyValue));
assertEquals(layer.getImageTiltDisplacement().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testBearingAsConstant() {
Timber.i("bearing");
assertNotNull(layer);
assertNull(layer.getBearing().getValue());
// Set and Get
Double propertyValue = 0.3;
layer.setProperties(bearing(propertyValue));
assertEquals(layer.getBearing().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLocationTransition() {
Timber.i("locationTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLocationTransition(options);
assertEquals(layer.getLocationTransition(), options);
}
@Test
@UiThreadTest
public void testLocationAsConstant() {
Timber.i("location");
assertNotNull(layer);
assertNull(layer.getLocation().getValue());
// Set and Get
Double[] propertyValue = new Double[] {0.0, 0.0, 0.0};
layer.setProperties(location(propertyValue));
assertEquals(layer.getLocation().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testAccuracyRadiusTransition() {
Timber.i("accuracy-radiusTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setAccuracyRadiusTransition(options);
assertEquals(layer.getAccuracyRadiusTransition(), options);
}
@Test
@UiThreadTest
public void testAccuracyRadiusAsConstant() {
Timber.i("accuracy-radius");
assertNotNull(layer);
assertNull(layer.getAccuracyRadius().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(accuracyRadius(propertyValue));
assertEquals(layer.getAccuracyRadius().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testTopImageSizeTransition() {
Timber.i("top-image-sizeTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setTopImageSizeTransition(options);
assertEquals(layer.getTopImageSizeTransition(), options);
}
@Test
@UiThreadTest
public void testTopImageSizeAsConstant() {
Timber.i("top-image-size");
assertNotNull(layer);
assertNull(layer.getTopImageSize().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(topImageSize(propertyValue));
assertEquals(layer.getTopImageSize().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testBearingImageSizeTransition() {
Timber.i("bearing-image-sizeTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setBearingImageSizeTransition(options);
assertEquals(layer.getBearingImageSizeTransition(), options);
}
@Test
@UiThreadTest
public void testBearingImageSizeAsConstant() {
Timber.i("bearing-image-size");
assertNotNull(layer);
assertNull(layer.getBearingImageSize().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(bearingImageSize(propertyValue));
assertEquals(layer.getBearingImageSize().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testShadowImageSizeTransition() {
Timber.i("shadow-image-sizeTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setShadowImageSizeTransition(options);
assertEquals(layer.getShadowImageSizeTransition(), options);
}
@Test
@UiThreadTest
public void testShadowImageSizeAsConstant() {
Timber.i("shadow-image-size");
assertNotNull(layer);
assertNull(layer.getShadowImageSize().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(shadowImageSize(propertyValue));
assertEquals(layer.getShadowImageSize().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testAccuracyRadiusColorTransition() {
Timber.i("accuracy-radius-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setAccuracyRadiusColorTransition(options);
assertEquals(layer.getAccuracyRadiusColorTransition(), options);
}
@Test
@UiThreadTest
public void testAccuracyRadiusColorAsConstant() {
Timber.i("accuracy-radius-color");
assertNotNull(layer);
assertNull(layer.getAccuracyRadiusColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(accuracyRadiusColor(propertyValue));
assertEquals(layer.getAccuracyRadiusColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testAccuracyRadiusColorAsIntConstant() {
Timber.i("accuracy-radius-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(accuracyRadiusColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getAccuracyRadiusColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testAccuracyRadiusBorderColorTransition() {
Timber.i("accuracy-radius-border-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setAccuracyRadiusBorderColorTransition(options);
assertEquals(layer.getAccuracyRadiusBorderColorTransition(), options);
}
@Test
@UiThreadTest
public void testAccuracyRadiusBorderColorAsConstant() {
Timber.i("accuracy-radius-border-color");
assertNotNull(layer);
assertNull(layer.getAccuracyRadiusBorderColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(accuracyRadiusBorderColor(propertyValue));
assertEquals(layer.getAccuracyRadiusBorderColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testAccuracyRadiusBorderColorAsIntConstant() {
Timber.i("accuracy-radius-border-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(accuracyRadiusBorderColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getAccuracyRadiusBorderColorAsInt(), Color.argb(127, 255, 127, 0));
}
}

View File

@@ -0,0 +1,779 @@
package com.mapbox.mapboxsdk.location
import android.Manifest
import android.content.Context
import android.graphics.Color
import android.location.Location
import androidx.test.annotation.UiThreadTest
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.UiController
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.GrantPermissionRule
import androidx.test.rule.GrantPermissionRule.grant
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.location.LocationComponentConstants.*
import com.mapbox.mapboxsdk.location.modes.RenderMode
import com.mapbox.mapboxsdk.location.utils.*
import com.mapbox.mapboxsdk.location.utils.MapboxTestingUtils.Companion.MAPBOX_HEAVY_STYLE
import com.mapbox.mapboxsdk.location.utils.MapboxTestingUtils.Companion.pushSourceUpdates
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils
import com.mapbox.mapboxsdk.utils.BitmapUtils
import kotlin.math.abs
import org.hamcrest.CoreMatchers.`is`
import org.hamcrest.CoreMatchers.notNullValue
import org.hamcrest.Matchers.equalTo
import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class LocationLayerControllerTest : EspressoTest() {
@Rule
@JvmField
val permissionRule: GrantPermissionRule = grant(Manifest.permission.ACCESS_FINE_LOCATION)
private lateinit var styleChangeIdlingResource: StyleChangeIdlingResource
private val location: Location by lazy {
val initLocation = Location("")
initLocation.latitude = 15.0
initLocation.longitude = 17.0
initLocation.bearing = 10f
initLocation.accuracy = 150f
initLocation
}
@Before
override fun beforeTest() {
super.beforeTest()
styleChangeIdlingResource = StyleChangeIdlingResource()
IdlingRegistry.getInstance().register(styleChangeIdlingResource)
}
//
// Location Source
//
@Test
fun renderModeNormal_sourceDoesGetAdded() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.NORMAL
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(style.getSource(LOCATION_SOURCE), notNullValue())
}
}
executeComponentTest(componentAction)
}
//
// Location Layers
//
@Test
fun renderModeNormal_trackingNormalLayersDoGetAdded() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.NORMAL
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(PULSING_CIRCLE_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun onMapChange_locationComponentPulsingCircleLayerGetsRedrawn() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.locationComponentOptions(LocationComponentOptions.builder(context)
.pulseEnabled(true)
.build())
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.NORMAL
component.forceLocationUpdate(location)
styleChangeIdlingResource.waitForStyle(mapboxMap, Style.LIGHT)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(component.renderMode, `is`(equalTo(RenderMode.NORMAL)))
// Check that the Source has been re-added to the new map style
val source: GeoJsonSource? = mapboxMap.style!!.getSourceAs(LOCATION_SOURCE)
assertThat(source, notNullValue())
// Check that the pulsing circle layer visibilities is set to visible
assertThat(mapboxMap.isLayerVisible(PULSING_CIRCLE_LAYER), `is`(true))
}
}
}
@Test
fun renderModeCompass_bearingLayersDoGetAdded() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.COMPASS
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(true))
}
}
executeComponentTest(componentAction)
}
@Test
fun pulsingCircle_enableLocationComponent_pulsingLayerVisibility() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.applyStyle(LocationComponentOptions.builder(context)
.pulseEnabled(true).build())
assertThat(mapboxMap.isLayerVisible(PULSING_CIRCLE_LAYER), `is`(true))
}
}
executeComponentTest(componentAction)
}
@Test
fun pulsingCircle_disableLocationComponent_pulsingLayerVisibility() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = false
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.isLayerVisible(PULSING_CIRCLE_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun pulsingCircle_changeColorCheck() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.applyStyle(LocationComponentOptions.builder(context)
.pulseEnabled(true)
.pulseColor(Color.RED)
.build())
component.applyStyle(LocationComponentOptions.builder(context)
.pulseEnabled(true)
.pulseColor(Color.BLUE)
.build())
mapboxMap.style.apply {
assertThat(component.locationComponentOptions.pulseColor(), `is`(Color.BLUE))
}
}
}
executeComponentTest(componentAction)
}
@Test
fun pulsingCircle_changeSpeedCheck() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.applyStyle(LocationComponentOptions.builder(context)
.pulseEnabled(true)
.pulseSingleDuration(8000f)
.build())
component.applyStyle(LocationComponentOptions.builder(context)
.pulseEnabled(true)
.pulseSingleDuration(400f)
.build())
mapboxMap.style.apply {
assertThat(component.locationComponentOptions.pulseSingleDuration(), `is`(400f))
}
}
}
executeComponentTest(componentAction)
}
@Test
fun renderModeGps_navigationLayersDoGetAdded() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.GPS
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun dontShowPuckWhenRenderModeSetAndComponentDisabled() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
component.isLocationComponentEnabled = false
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.renderMode = RenderMode.GPS
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun whenLocationComponentDisabled_doesSetAllLayersToVisibilityNone() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.NORMAL
component.forceLocationUpdate(location)
component.isLocationComponentEnabled = false
TestingAsyncUtils.waitForLayer(uiController, mapView)
// Check that all layers visibilities are set to none
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(false))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun onMapChange_locationComponentLayersDoGetRedrawn() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.renderMode = RenderMode.NORMAL
component.forceLocationUpdate(location)
styleChangeIdlingResource.waitForStyle(mapboxMap, Style.LIGHT)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(component.renderMode, `is`(equalTo(RenderMode.NORMAL)))
// Check that the Source has been re-added to the new map style
val source: GeoJsonSource? = mapboxMap.style!!.getSourceAs(LOCATION_SOURCE)
assertThat(source, notNullValue())
// Check that all layers visibilities are set to visible
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
fun whenStyleChanged_continuesUsingStaleIcons() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.applyStyle(LocationComponentOptions.builder(context).staleStateTimeout(100).build())
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
uiController.loopMainThreadForAtLeast(150)
assertThat(
mapboxMap.querySourceFeatures(LOCATION_SOURCE)[0].getBooleanProperty(PROPERTY_LOCATION_STALE),
`is`(true)
)
mapboxMap.setStyle(Style.Builder().fromUrl(Style.LIGHT))
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(
mapboxMap.querySourceFeatures(LOCATION_SOURCE)[0].getBooleanProperty(PROPERTY_LOCATION_STALE),
`is`(true)
)
}
}
executeComponentTest(componentAction)
}
@Test
fun whenStyleChanged_isDisabled_hasLayerBelow_staysHidden() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.isLocationComponentEnabled = false
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.queryRenderedFeatures(location, FOREGROUND_LAYER).isEmpty(), `is`(true))
val options = component.locationComponentOptions
.toBuilder()
.layerBelow("road-label")
.build()
component.applyStyle(options)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(mapboxMap.queryRenderedFeatures(location, FOREGROUND_LAYER).isEmpty(), `is`(true))
}
}
executeComponentTest(componentAction)
}
@Test
fun whenStyleChanged_staleStateChanges() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.applyStyle(LocationComponentOptions.builder(context).staleStateTimeout(1).build())
styleChangeIdlingResource.waitForStyle(mapboxMap, MAPBOX_HEAVY_STYLE)
pushSourceUpdates(styleChangeIdlingResource) {
component.forceLocationUpdate(location)
}
}
}
executeComponentTest(componentAction)
// Waiting for style to finish loading while pushing updates
onView(withId(android.R.id.content)).check(matches(isDisplayed()))
}
@Test
fun whenStyleChanged_layerVisibilityUpdates() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
styleChangeIdlingResource.waitForStyle(mapboxMap, MAPBOX_HEAVY_STYLE)
uiController.loopMainThreadForAtLeast(100)
var show = true
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, mapboxMap.style!!)
.useDefaultLocationEngine(false)
.build()
)
pushSourceUpdates(styleChangeIdlingResource) {
component.isLocationComponentEnabled = show
show = !show
}
TestingAsyncUtils.waitForLayer(uiController, mapView)
}
}
executeComponentTest(componentAction)
// Waiting for style to finish loading while pushing updates
onView(withId(android.R.id.content)).check(matches(isDisplayed()))
}
@Test
fun accuracy_visibleWithNewLocation() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(location), 16.0))
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
uiController.loopMainThreadForAtLeast(ACCURACY_RADIUS_ANIMATION_DURATION)
assertEquals(
Utils.calculateZoomLevelRadius(mapboxMap, location) /*meters projected to radius on zoom 16*/,
mapboxMap.querySourceFeatures(LOCATION_SOURCE)[0]
.getNumberProperty(PROPERTY_ACCURACY_RADIUS).toFloat(), 0.1f
)
}
}
executeComponentTest(componentAction)
}
@Test
fun accuracy_visibleWhenCameraEased() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
val target = LatLng(location)
val zoom = 16.0
mapboxMap.easeCamera(CameraUpdateFactory.newLatLngZoom(target, zoom), 300)
uiController.loopMainThreadForAtLeast(300)
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(
Math.abs(zoom - mapboxMap.cameraPosition.zoom) < 0.1 &&
Math.abs(target.latitude - mapboxMap.cameraPosition.target.latitude) < 0.1 &&
Math.abs(target.longitude - mapboxMap.cameraPosition.target.longitude) < 0.1,
`is`(true)
)
val expectedRadius =
Utils.calculateZoomLevelRadius(mapboxMap, location) /*meters projected to radius on zoom 16*/
assertThat(
Math.abs(
expectedRadius - mapboxMap.querySourceFeatures(LOCATION_SOURCE)[0].getNumberProperty(
PROPERTY_ACCURACY_RADIUS
).toFloat()
) < 0.1,
`is`(true)
)
}
}
executeComponentTest(componentAction)
}
@Test
fun accuracy_visibleWhenCameraMoved() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
val target = LatLng(location)
val zoom = 16.0
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(target, zoom))
TestingAsyncUtils.waitForLayer(uiController, mapView)
assertThat(
abs(zoom - mapboxMap.cameraPosition.zoom) < 0.1 &&
abs(target.latitude - mapboxMap.cameraPosition.target.latitude) < 0.1 &&
abs(target.longitude - mapboxMap.cameraPosition.target.longitude) < 0.1,
`is`(true)
)
val expectedRadius =
Utils.calculateZoomLevelRadius(mapboxMap, location) /*meters projected to radius on zoom 16*/
assertThat(
Math.abs(
expectedRadius - mapboxMap.querySourceFeatures(LOCATION_SOURCE)[0].getNumberProperty(
PROPERTY_ACCURACY_RADIUS
).toFloat()
) < 0.1,
`is`(true)
)
}
}
executeComponentTest(componentAction)
}
@Test
fun applyStyle_layerBelow_restoreLayerVisibility() {
val componentAction = object : LocationComponentAction.OnPerformLocationComponentAction {
override fun onLocationComponentAction(
component: LocationComponent,
mapboxMap: MapboxMap,
style: Style,
uiController: UiController,
context: Context
) {
component.activateLocationComponent(
LocationComponentActivationOptions
.builder(context, style)
.useDefaultLocationEngine(false)
.build()
)
component.isLocationComponentEnabled = true
component.forceLocationUpdate(location)
TestingAsyncUtils.waitForLayer(uiController, mapView)
component.applyStyle(LocationComponentOptions.builder(context).layerBelow("road-label").build())
assertThat(mapboxMap.isLayerVisible(FOREGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BACKGROUND_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(SHADOW_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(ACCURACY_LAYER), `is`(true))
assertThat(mapboxMap.isLayerVisible(BEARING_LAYER), `is`(false))
}
}
executeComponentTest(componentAction)
}
@Test
@UiThreadTest
fun test_15026_missingShadowGradientRadius() {
// test for https://github.com/mapbox/mapbox-gl-native/issues/15026
val shadowDrawable = BitmapUtils.getDrawableFromRes(context, R.drawable.mapbox_user_icon_shadow_0px_test)
Utils.generateShadow(shadowDrawable, 0f)
}
@After
override fun afterTest() {
super.afterTest()
IdlingRegistry.getInstance().unregister(styleChangeIdlingResource)
}
private fun executeComponentTest(listener: LocationComponentAction.OnPerformLocationComponentAction) {
onView(withId(android.R.id.content)).perform(LocationComponentAction(mapboxMap, listener))
}
}

View File

@@ -0,0 +1,38 @@
package com.mapbox.mapboxsdk.location.utils
import android.content.Context
import android.view.View
import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.ViewMatchers.isDisplayed
import com.mapbox.mapboxsdk.location.LocationComponent
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
import org.hamcrest.Matcher
class LocationComponentAction(
private val mapboxMap: MapboxMap,
private val onPerformLocationComponentAction: OnPerformLocationComponentAction
) : ViewAction {
override fun getConstraints(): Matcher<View> {
return isDisplayed()
}
override fun getDescription(): String {
return javaClass.simpleName
}
override fun perform(uiController: UiController, view: View) {
onPerformLocationComponentAction.onLocationComponentAction(
mapboxMap.locationComponent,
mapboxMap,
mapboxMap.style!!,
uiController,
view.context)
}
interface OnPerformLocationComponentAction {
fun onLocationComponentAction(component: LocationComponent, mapboxMap: MapboxMap, style: Style, uiController: UiController, context: Context)
}
}

View File

@@ -0,0 +1,79 @@
package com.mapbox.mapboxsdk.location.utils
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.Drawable
import android.location.Location
import android.os.Handler
import android.os.Looper
import com.mapbox.geojson.Feature
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.style.layers.Property
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
fun MapboxMap.querySourceFeatures(sourceId: String): List<Feature> {
return this.style!!.getSourceAs<GeoJsonSource>(sourceId)?.querySourceFeatures(null) ?: emptyList()
}
fun MapboxMap.queryRenderedFeatures(location: Location, layerId: String): List<Feature> {
val latLng = LatLng(location.latitude, location.longitude)
val point = this.projection.toScreenLocation(latLng)
return this.queryRenderedFeatures(point, layerId)
}
fun MapboxMap.isLayerVisible(layerId: String): Boolean {
return this.style!!.getLayer(layerId)?.visibility?.value?.equals(Property.VISIBLE)!!
}
class MapboxTestingUtils {
companion object {
/**
* Used to increase style load time for stress testing.
*/
const val MAPBOX_HEAVY_STYLE = "asset://heavy_style.json"
private const val DATA_PUSH_INTERVAL = 1L
/**
* Pushes data updates every [DATA_PUSH_INTERVAL] milliseconds until the style has been loaded,
* checked with [StyleChangeIdlingResource].
*/
fun pushSourceUpdates(styleChangeIdlingResource: StyleChangeIdlingResource, update: () -> Unit) {
val mainHandler = Handler(Looper.getMainLooper())
val runnable = object : Runnable {
override fun run() {
update.invoke()
if (!styleChangeIdlingResource.isIdleNow) {
mainHandler.postDelayed(this, DATA_PUSH_INTERVAL)
}
}
}
if (!styleChangeIdlingResource.isIdleNow) {
if (Looper.myLooper() == Looper.getMainLooper()) {
runnable.run()
} else {
mainHandler.post(runnable)
}
}
}
}
}
fun MapboxMap.addImageFromDrawable(string: String, drawable: Drawable) {
val bitmapFromDrawable = getBitmapFromDrawable(drawable)
this.style!!.addImage(string, bitmapFromDrawable)
}
private fun getBitmapFromDrawable(drawable: Drawable): Bitmap {
if (drawable is BitmapDrawable) return drawable.bitmap
val bitmap = Bitmap.createBitmap(drawable.intrinsicWidth,
drawable.intrinsicHeight, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
return bitmap
}

View File

@@ -0,0 +1,40 @@
package com.mapbox.mapboxsdk.location.utils
import androidx.test.espresso.IdlingResource
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
/**
* Resource, that's idling until the provided style is loaded.
* Remember to add any espresso action (like view assertion) after the [waitForStyle] call
* for the test to keep running.
*/
class StyleChangeIdlingResource : IdlingResource {
private var callback: IdlingResource.ResourceCallback? = null
private var isIdle = true
override fun getName(): String {
return javaClass.simpleName
}
override fun isIdleNow(): Boolean {
return isIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.callback = callback
}
private fun setIdle() {
isIdle = true
callback?.onTransitionToIdle()
}
fun waitForStyle(mapboxMap: MapboxMap, styleUrl: String) {
isIdle = false
mapboxMap.setStyle(Style.Builder().fromUri(styleUrl)) {
setIdle()
}
}
}

View File

@@ -0,0 +1,27 @@
package com.mapbox.mapboxsdk.maps
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.style.layers.Layer
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
abstract class BaseLayerTest : AppCenter() {
private lateinit var nativeMapView: NativeMap
companion object {
const val WIDTH = 500
const val HEIGHT = WIDTH
}
fun before() {
val context = InstrumentationRegistry.getInstrumentation().context
nativeMapView = NativeMapView(context, false, null, null, NativeMapViewTest.DummyRenderer(context))
nativeMapView.resizeView(WIDTH, HEIGHT)
}
fun setupLayer(layer: Layer) {
nativeMapView.addLayer(layer)
}
}

View File

@@ -0,0 +1,516 @@
package com.mapbox.mapboxsdk.maps
import android.graphics.PointF
import android.os.SystemClock
import android.view.MotionEvent
import android.view.View
import androidx.test.espresso.Espresso
import androidx.test.espresso.InjectEventSecurityException
import androidx.test.espresso.UiController
import androidx.test.espresso.ViewAction
import androidx.test.espresso.matcher.ViewMatchers
import org.hamcrest.Matcher
object GesturesUiTestUtils {
private const val DEFAULT_GESTURE_DURATION = 500L
fun pinch(
startSpan: Float,
endSpan: Float,
center: PointF? = null,
duration: Long = DEFAULT_GESTURE_DURATION
): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> {
return ViewMatchers.isEnabled()
}
override fun getDescription(): String = "Pinch $startSpan -> $endSpan"
override fun perform(uiController: UiController, view: View) {
var middlePosition = center
if (middlePosition == null) {
middlePosition = getCenterPointF(view)
}
val startPoint1 = PointF(middlePosition.x - startSpan / 2f, middlePosition.y)
val startPoint2 = PointF(middlePosition.x + startSpan / 2f, middlePosition.y)
val endPoint1 = PointF(middlePosition.x - endSpan / 2f, middlePosition.y)
val endPoint2 = PointF(middlePosition.x + endSpan / 2f, middlePosition.y)
performPinch(uiController, startPoint1, startPoint2, endPoint1, endPoint2, duration)
}
}
}
fun quickScale(
deltaY: Float,
startPoint: PointF? = null,
withVelocity: Boolean = true,
duration: Long = DEFAULT_GESTURE_DURATION,
interrupt: Boolean = false
): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()
override fun getDescription(): String = "quick scale ${deltaY}Y"
override fun perform(uiController: UiController, view: View) {
var middlePosition = startPoint
if (middlePosition == null) {
middlePosition = getCenterPointF(view)
}
val endPoint = PointF(middlePosition.x, middlePosition.y + deltaY)
performQuickScale(uiController, middlePosition, endPoint, withVelocity, duration, interrupt)
}
}
}
fun move(
deltaX: Float,
deltaY: Float,
startPoint: PointF? = null,
withVelocity: Boolean = true,
duration: Long = DEFAULT_GESTURE_DURATION
): ViewAction {
return object : ViewAction {
override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()
override fun getDescription(): String = "move ${deltaX}X, ${deltaY}Y"
override fun perform(uiController: UiController, view: View) {
var middlePosition = startPoint
if (middlePosition == null) {
middlePosition = getCenterPointF(view)
}
val endPoint = PointF(middlePosition.x + deltaX, middlePosition.y + deltaY)
performMove(uiController, middlePosition, endPoint, withVelocity, duration)
}
}
}
private fun getCenterPointF(view: View): PointF {
val locationOnScreen = IntArray(2)
view.getLocationOnScreen(locationOnScreen)
val viewHeight = view.height * view.scaleY
val viewWidth = view.width * view.scaleX
return PointF(
(locationOnScreen[0] + viewWidth / 2).toInt().toFloat(),
(locationOnScreen[1] + viewHeight / 2).toInt().toFloat()
)
}
// https://stackoverflow.com/a/46443628/9126211
private fun performPinch(
uiController: UiController,
startPoint1: PointF,
startPoint2: PointF,
endPoint1: PointF,
endPoint2: PointF,
duration: Long
) {
val eventMinInterval: Long = 10
val startTime = SystemClock.uptimeMillis()
var eventTime = startTime
var event: MotionEvent
var eventX1: Float = startPoint1.x
var eventY1: Float = startPoint1.y
var eventX2: Float = startPoint2.x
var eventY2: Float = startPoint2.y
// Specify the property for the two touch points
val properties = arrayOfNulls<MotionEvent.PointerProperties>(2)
val pp1 = MotionEvent.PointerProperties()
pp1.id = 0
pp1.toolType = MotionEvent.TOOL_TYPE_FINGER
val pp2 = MotionEvent.PointerProperties()
pp2.id = 1
pp2.toolType = MotionEvent.TOOL_TYPE_FINGER
properties[0] = pp1
properties[1] = pp2
// Specify the coordinations of the two touch points
// NOTE: you MUST set the pressure and size value, or it doesn't work
val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(2)
val pc1 = MotionEvent.PointerCoords()
pc1.x = eventX1
pc1.y = eventY1
pc1.pressure = 1f
pc1.size = 1f
val pc2 = MotionEvent.PointerCoords()
pc2.x = eventX2
pc2.y = eventY2
pc2.pressure = 1f
pc2.size = 1f
pointerCoords[0] = pc1
pointerCoords[1] = pc2
/*
* Events sequence of zoom gesture:
*
* 1. Send ACTION_DOWN event of one start point
* 2. Send ACTION_POINTER_DOWN of two start points
* 3. Send ACTION_MOVE of two middle points
* 4. Repeat step 3 with updated middle points (x,y), until reach the end points
* 5. Send ACTION_POINTER_UP of two end points
* 6. Send ACTION_UP of one end point
*/
try {
// Step 1
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_DOWN, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 2
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_POINTER_DOWN + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2,
properties, pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 3, 4
val moveEventNumber = duration / eventMinInterval
val stepX1: Float
val stepY1: Float
val stepX2: Float
val stepY2: Float
stepX1 = (endPoint1.x - startPoint1.x) / moveEventNumber
stepY1 = (endPoint1.y - startPoint1.y) / moveEventNumber
stepX2 = (endPoint2.x - startPoint2.x) / moveEventNumber
stepY2 = (endPoint2.y - startPoint2.y) / moveEventNumber
for (i in 0 until moveEventNumber) {
// Update the move events
eventTime += eventMinInterval
eventX1 += stepX1
eventY1 += stepY1
eventX2 += stepX2
eventY2 += stepY2
pc1.x = eventX1
pc1.y = eventY1
pc2.x = eventX2
pc2.y = eventY2
pointerCoords[0] = pc1
pointerCoords[1] = pc2
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_MOVE, 2, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
}
// Step 5
pc1.x = endPoint1.x
pc1.y = endPoint1.y
pc2.x = endPoint2.x
pc2.y = endPoint2.y
pointerCoords[0] = pc1
pointerCoords[1] = pc2
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_POINTER_UP + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 6
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_UP, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
} catch (ex: InjectEventSecurityException) {
throw RuntimeException("Could not perform pinch", ex)
}
}
private fun performQuickScale(
uiController: UiController,
startPoint: PointF,
endPoint: PointF,
withVelocity: Boolean,
duration: Long,
interrupt: Boolean
) {
val eventMinInterval: Long = 10
val tapDownMinInterval: Long = 40 // ViewConfiguration#DOUBLE_TAP_MIN_TIME = 40
val startTime = SystemClock.uptimeMillis()
var eventTime = startTime
var event: MotionEvent
var eventX1: Float = startPoint.x
var eventY1: Float = startPoint.y
var properties = arrayOfNulls<MotionEvent.PointerProperties>(1)
val pp1 = MotionEvent.PointerProperties()
pp1.id = 0
pp1.toolType = MotionEvent.TOOL_TYPE_FINGER
properties[0] = pp1
var pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(1)
val pc1 = MotionEvent.PointerCoords()
pc1.x = eventX1
pc1.y = eventY1
pc1.pressure = 1f
pc1.size = 1f
pointerCoords[0] = pc1
/*
* Events sequence of quick scale gesture:
*
* 1. Send ACTION_DOWN
* 2. Send ACTION_UP
* 3. Send ACTION_DOWN
* 4. Send ACTION_MOVE with updated middle points (x,y), until reach the end points
* 5. Send ACTION_UP of one end point
*/
try {
// Step 1
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_DOWN, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 2
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_UP, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 3
eventTime += tapDownMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_DOWN, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 4
val moveEventNumber = duration / eventMinInterval
val stepX1: Float
val stepY1: Float
stepX1 = (endPoint.x - startPoint.x) / moveEventNumber
stepY1 = (endPoint.y - startPoint.y) / moveEventNumber
var interrupted = false
for (i in 0 until moveEventNumber) {
// Update the move events
eventTime += eventMinInterval
eventX1 += stepX1
eventY1 += stepY1
pc1.x = eventX1
pc1.y = eventY1
pointerCoords[0] = pc1
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_MOVE, if (interrupted) 2 else 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
if (interrupt && i == moveEventNumber / 2) {
// Specify the property for the two touch points
properties = arrayOfNulls<MotionEvent.PointerProperties>(2)
val pp2 = MotionEvent.PointerProperties()
pp2.id = 1
pp2.toolType = MotionEvent.TOOL_TYPE_FINGER
properties[0] = pp1
properties[1] = pp2
// Specify the coordinations of the two touch points
// NOTE: you MUST set the pressure and size value, or it doesn't work
pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(2)
val pc2 = MotionEvent.PointerCoords()
pc2.x = startPoint.x
pc2.y = startPoint.y
pc2.pressure = 1f
pc2.size = 1f
pointerCoords[0] = pc1
pointerCoords[1] = pc2
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_POINTER_DOWN + (pp2.id shl MotionEvent.ACTION_POINTER_INDEX_SHIFT), 2,
properties, pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
interrupted = true
}
}
if (!withVelocity) {
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_MOVE, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
}
// Step 5
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_UP, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
} catch (ex: InjectEventSecurityException) {
throw RuntimeException("Could not perform quick scale", ex)
}
}
private fun performMove(
uiController: UiController,
startPoint: PointF,
endPoint: PointF,
withVelocity: Boolean,
duration: Long
) {
val eventMinInterval: Long = 10
val startTime = SystemClock.uptimeMillis()
var eventTime = startTime
var event: MotionEvent
var eventX1: Float = startPoint.x
var eventY1: Float = startPoint.y
val properties = arrayOfNulls<MotionEvent.PointerProperties>(1)
val pp1 = MotionEvent.PointerProperties()
pp1.id = 0
pp1.toolType = MotionEvent.TOOL_TYPE_FINGER
properties[0] = pp1
val pointerCoords = arrayOfNulls<MotionEvent.PointerCoords>(1)
val pc1 = MotionEvent.PointerCoords()
pc1.x = eventX1
pc1.y = eventY1
pc1.pressure = 1f
pc1.size = 1f
pointerCoords[0] = pc1
/*
* Events sequence of move gesture:
*
* 1. Send ACTION_DOWN
* 2. Send ACTION_MOVE with updated middle points (x,y), until reach the end points
* 3. Send ACTION_UP
*/
try {
// Step 1
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_DOWN, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
// Step 2
val moveEventNumber = duration / eventMinInterval
val stepX1: Float
val stepY1: Float
stepX1 = (endPoint.x - startPoint.x) / moveEventNumber
stepY1 = (endPoint.y - startPoint.y) / moveEventNumber
for (i in 0 until moveEventNumber) {
// Update the move events
eventTime += eventMinInterval
eventX1 += stepX1
eventY1 += stepY1
pc1.x = eventX1
pc1.y = eventY1
pointerCoords[0] = pc1
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_MOVE, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
}
if (!withVelocity) {
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_MOVE, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
}
// Step 3
eventTime += eventMinInterval
event = MotionEvent.obtain(
startTime, eventTime,
MotionEvent.ACTION_UP, 1, properties,
pointerCoords, 0, 0, 1f, 1f, 0, 0, 0, 0
)
injectMotionEventToUiController(uiController, event)
} catch (ex: InjectEventSecurityException) {
throw RuntimeException("Could not perform quick scale", ex)
}
}
/**
* Safely call uiController.injectMotionEvent(event): Detect any error and "convert" it to an
* IllegalStateException
*/
@Throws(InjectEventSecurityException::class)
private fun injectMotionEventToUiController(uiController: UiController, event: MotionEvent) {
val injectEventSucceeded = uiController.injectMotionEvent(event)
if (!injectEventSucceeded) {
throw IllegalStateException("Error performing event $event")
}
}
}
fun Int.loopFor(millis: Long) {
Espresso.onView(ViewMatchers.withId(this)).perform(object : ViewAction {
override fun getDescription(): String = "waiting for $millis"
override fun getConstraints(): Matcher<View> = ViewMatchers.isEnabled()
override fun perform(uiController: UiController?, view: View?) {
uiController?.loopMainThreadForAtLeast(millis)
}
})
}

View File

@@ -0,0 +1,42 @@
package com.mapbox.mapboxsdk.maps;
import com.mapbox.mapboxsdk.annotations.Icon;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import timber.log.Timber;
public class IconManagerResolver {
private IconManager iconManager;
public IconManagerResolver(MapboxMap mapboxMap) {
try {
Field annotationManagerField = MapboxMap.class.getDeclaredField("annotationManager");
annotationManagerField.setAccessible(true);
AnnotationManager annotationManager = (AnnotationManager) annotationManagerField.get(mapboxMap);
Field iconManagerField = AnnotationManager.class.getDeclaredField("iconManager");
iconManagerField.setAccessible(true);
iconManager = (IconManager) iconManagerField.get(annotationManager);
} catch (Exception exception) {
Timber.e(exception, "Could not create IconManagerResolver, unable to reflect.");
}
}
@SuppressWarnings("unchecked")
public Map<Icon, Integer> getIconMap() {
try {
Field field = IconManager.class.getDeclaredField("iconMap");
field.setAccessible(true);
return (Map<Icon, Integer>) field.get(iconManager);
} catch (NoSuchFieldException exception) {
Timber.e(exception, "Could not getIconMap, unable to reflect.");
} catch (IllegalAccessException exception) {
Timber.e(exception, "Could not getIconMap, unable to reflect.");
}
return new HashMap<>();
}
}

View File

@@ -0,0 +1,193 @@
package com.mapbox.mapboxsdk.maps
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.withId
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.constants.MapboxConstants
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.GesturesUiTestUtils.move
import com.mapbox.mapboxsdk.maps.GesturesUiTestUtils.quickScale
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.BaseTest
import com.mapbox.mapboxsdk.testapp.activity.maplayout.SimpleMapActivity
import org.junit.Assert
import org.junit.Before
import org.junit.Test
class MapGestureDetectorTest : BaseTest() {
override fun getActivityClass() = SimpleMapActivity::class.java
private var maxWidth: Int = 0
private var maxHeight: Int = 0
@Before
fun setup() {
maxWidth = mapView.width
maxHeight = mapView.height
}
@Test
fun sanity_quickZoom() {
validateTestSetup()
var initialZoom: Double? = null
rule.runOnUiThread {
initialZoom = mapboxMap.cameraPosition.zoom
}
onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f, withVelocity = false))
rule.runOnUiThread {
Assert.assertTrue(mapboxMap.cameraPosition.zoom > initialZoom!!)
}
}
@Test
fun quickZoomDisabled_phantomQuickZoom_moveStillEnabled_15091() {
// regression test for https://github.com/mapbox/mapbox-gl-native/issues/15091
validateTestSetup()
var initialCameraPosition: CameraPosition? = null
rule.runOnUiThread {
// zoom in so we can move vertically
mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(4.0))
initialCameraPosition = mapboxMap.cameraPosition
mapboxMap.uiSettings.isQuickZoomGesturesEnabled = false
}
onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f))
rule.runOnUiThread {
// camera did not move
Assert.assertEquals(initialCameraPosition!!, mapboxMap.cameraPosition)
}
// move to expected target
onView(withId(R.id.mapView)).perform(move(-maxWidth / 2f, -maxHeight / 2f, withVelocity = false))
rule.runOnUiThread {
Assert.assertNotEquals(initialCameraPosition!!.target.latitude, mapboxMap.cameraPosition.target.latitude, 1.0)
Assert.assertNotEquals(initialCameraPosition!!.target.longitude, mapboxMap.cameraPosition.target.longitude, 1.0)
}
}
@Test
fun quickZoom_doNotMove_14227() {
// test for https://github.com/mapbox/mapbox-gl-native/issues/14227
validateTestSetup()
var initialTarget: LatLng? = null
rule.runOnUiThread {
initialTarget = mapboxMap.cameraPosition.target
}
onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f))
rule.runOnUiThread {
// camera did not move
Assert.assertEquals(initialTarget!!.latitude, mapboxMap.cameraPosition.target.latitude, 1.0)
Assert.assertEquals(initialTarget!!.longitude, mapboxMap.cameraPosition.target.longitude, 1.0)
}
}
@Test
fun quickZoom_interrupted_moveStillEnabled_14598() {
// test for https://github.com/mapbox/mapbox-gl-native/issues/14598
validateTestSetup()
onView(withId(R.id.mapView)).perform(quickScale(maxHeight / 2f, interrupt = true))
var initialCameraPosition: CameraPosition? = null
rule.runOnUiThread {
// zoom in so we can move vertically
mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(4.0))
initialCameraPosition = mapboxMap.cameraPosition
mapboxMap.uiSettings.isQuickZoomGesturesEnabled = false
}
// move to expected target
onView(withId(R.id.mapView)).perform(move(-maxWidth / 2f, -maxHeight / 2f, withVelocity = false))
rule.runOnUiThread {
Assert.assertNotEquals(initialCameraPosition!!.target.latitude, mapboxMap.cameraPosition.target.latitude, 1.0)
Assert.assertNotEquals(initialCameraPosition!!.target.longitude, mapboxMap.cameraPosition.target.longitude, 1.0)
}
}
@Test
fun quickZoom_ignoreDoubleTap() {
// test for https://github.com/mapbox/mapbox-gl-native/issues/14013
validateTestSetup()
var initialZoom: Double? = null
rule.runOnUiThread {
mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(2.0))
initialZoom = mapboxMap.cameraPosition.zoom
}
onView(withId(R.id.mapView)).perform(quickScale(-(mapboxMap.gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold * 2), withVelocity = false, duration = 1000L))
R.id.mapView.loopFor(MapboxConstants.ANIMATION_DURATION.toLong())
rule.runOnUiThread {
Assert.assertTrue(mapboxMap.cameraPosition.zoom < initialZoom!!)
}
}
@Test
fun doubleTap_minimalMovement() {
validateTestSetup()
var initialZoom: Double? = null
rule.runOnUiThread {
initialZoom = mapboxMap.cameraPosition.zoom
}
onView(withId(R.id.mapView)).perform(quickScale(mapboxMap.gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold / 2, withVelocity = false, duration = 50L))
R.id.mapView.loopFor(MapboxConstants.ANIMATION_DURATION.toLong())
rule.runOnUiThread {
Assert.assertEquals(initialZoom!! + 1, mapboxMap.cameraPosition.zoom, 0.1)
}
}
@Test
fun doubleTap_overMaxThreshold_ignore_14013() {
// test for https://github.com/mapbox/mapbox-gl-native/issues/14013
validateTestSetup()
var initialZoom: Double? = null
rule.runOnUiThread {
initialZoom = mapboxMap.cameraPosition.zoom
mapboxMap.uiSettings.isQuickZoomGesturesEnabled = false
}
onView(withId(R.id.mapView)).perform(quickScale(mapboxMap.gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold * 2, withVelocity = false, duration = 50L))
R.id.mapView.loopFor(MapboxConstants.ANIMATION_DURATION.toLong())
rule.runOnUiThread {
Assert.assertEquals(initialZoom!!, mapboxMap.cameraPosition.zoom, 0.01)
}
}
@Test
fun doubleTap_interrupted_moveStillEnabled() {
validateTestSetup()
rule.runOnUiThread {
mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(4.0))
}
onView(withId(R.id.mapView)).perform(quickScale(mapboxMap.gesturesManager.standardScaleGestureDetector.spanSinceStartThreshold / 2, withVelocity = false, duration = 50L, interrupt = true))
var initialCameraPosition: CameraPosition? = null
rule.runOnUiThread {
// zoom in so we can move vertically
mapboxMap.moveCamera(CameraUpdateFactory.zoomTo(4.0))
initialCameraPosition = mapboxMap.cameraPosition
mapboxMap.uiSettings.isQuickZoomGesturesEnabled = false
}
// move to expected target
onView(withId(R.id.mapView)).perform(move(-maxWidth / 2f, -maxHeight / 2f, withVelocity = false))
rule.runOnUiThread {
Assert.assertNotEquals(initialCameraPosition!!.target.latitude, mapboxMap.cameraPosition.target.latitude, 1.0)
Assert.assertNotEquals(initialCameraPosition!!.target.longitude, mapboxMap.cameraPosition.target.longitude, 1.0)
}
}
@Test
fun quickZoom_roundTripping() {
validateTestSetup()
rule.runOnUiThread {
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(51.0, 16.0), 3.0))
}
onView(withId(R.id.mapView)).perform(quickScale(300f, withVelocity = false, duration = 750L))
onView(withId(R.id.mapView)).perform(quickScale(-300f, withVelocity = false, duration = 750L))
rule.runOnUiThread {
Assert.assertEquals(3.0, mapboxMap.cameraPosition.zoom, 0.0001)
}
}
}

View File

@@ -0,0 +1,477 @@
package com.mapbox.mapboxsdk.maps;
import android.graphics.Color;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import android.view.View;
import com.mapbox.mapboxsdk.annotations.BaseMarkerOptions;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.annotations.Polygon;
import com.mapbox.mapboxsdk.annotations.PolygonOptions;
import com.mapbox.mapboxsdk.annotations.Polyline;
import com.mapbox.mapboxsdk.annotations.PolylineOptions;
import com.mapbox.mapboxsdk.exceptions.InvalidMarkerPositionException;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.hamcrest.Matcher;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* This test is responsible for testing the public API.
* <p>
* Methods executed on MapboxMap are called from a ViewAction to ensure correct synchronisation
* with the application UI-thread.
* </p>
* @deprecated remove this file when removing deprecated annotations
*/
@Deprecated
public class MapboxMapTest extends EspressoTest {
//
// InfoWindow
//
@Test
public void testConcurrentInfoWindowEnabled() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
mapboxMap.setAllowConcurrentMultipleOpenInfoWindows(true);
assertTrue("ConcurrentWindows should be true", mapboxMap.isAllowConcurrentMultipleOpenInfoWindows());
}));
}
@Test
public void testConcurrentInfoWindowDisabled() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
mapboxMap.setAllowConcurrentMultipleOpenInfoWindows(false);
assertFalse("ConcurrentWindows should be false", mapboxMap.isAllowConcurrentMultipleOpenInfoWindows());
}));
}
@Test
public void testInfoWindowAdapter() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MapboxMap.InfoWindowAdapter infoWindowAdapter = marker -> null;
mapboxMap.setInfoWindowAdapter(infoWindowAdapter);
assertEquals("InfoWindowAdpter should be the same", infoWindowAdapter, mapboxMap.getInfoWindowAdapter());
}));
}
//
// Annotations
//
@Test
public void testAddMarker() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker = mapboxMap.addMarker(markerOptions);
assertTrue("Marker should be contained", mapboxMap.getMarkers().contains(marker));
}));
}
@Test(expected = InvalidMarkerPositionException.class)
public void testAddMarkerInvalidPosition() {
new MarkerOptions().getMarker();
}
@Test
public void testAddMarkers() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
MarkerOptions markerOptions1 = new MarkerOptions().position(new LatLng()).title("a");
MarkerOptions markerOptions2 = new MarkerOptions().position(new LatLng()).title("b");
markerList.add(markerOptions1);
markerList.add(markerOptions2);
List<Marker> markers = mapboxMap.addMarkers(markerList);
assertEquals("Markers size should be 2", 2, mapboxMap.getMarkers().size());
assertTrue(mapboxMap.getMarkers().contains(markers.get(0)));
assertTrue(mapboxMap.getMarkers().contains(markers.get(1)));
}));
}
@Test
public void testAddMarkersEmpty() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
mapboxMap.addMarkers(markerList);
assertEquals("Markers size should be 0", 0, mapboxMap.getMarkers().size());
}));
}
@Test
public void testAddMarkersSingleMarker() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
MarkerOptions markerOptions = new MarkerOptions().title("a").position(new LatLng());
markerList.add(markerOptions);
List<Marker> markers = mapboxMap.addMarkers(markerList);
assertEquals("Markers size should be 1", 1, mapboxMap.getMarkers().size());
assertTrue(mapboxMap.getMarkers().contains(markers.get(0)));
}));
}
@Test
public void testAddPolygon() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolygonOptions polygonOptions = new PolygonOptions().add(new LatLng());
Polygon polygon = mapboxMap.addPolygon(polygonOptions);
assertTrue("Polygon should be contained", mapboxMap.getPolygons().contains(polygon));
}));
}
@Test
public void testAddEmptyPolygon() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolygonOptions polygonOptions = new PolygonOptions();
Polygon polygon = mapboxMap.addPolygon(polygonOptions);
assertTrue("Polygon should be ignored", !mapboxMap.getPolygons().contains(polygon));
}));
}
@Test
public void testAddPolygons() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<PolygonOptions> polygonList = new ArrayList<>();
PolygonOptions polygonOptions1 = new PolygonOptions().fillColor(Color.BLACK).add(new LatLng());
PolygonOptions polygonOptions2 = new PolygonOptions().fillColor(Color.WHITE).add(new LatLng());
PolygonOptions polygonOptions3 = new PolygonOptions();
polygonList.add(polygonOptions1);
polygonList.add(polygonOptions2);
polygonList.add(polygonOptions3);
mapboxMap.addPolygons(polygonList);
assertEquals("Polygons size should be 2", 2, mapboxMap.getPolygons().size());
assertTrue(mapboxMap.getPolygons().contains(polygonOptions1.getPolygon()));
assertTrue(mapboxMap.getPolygons().contains(polygonOptions2.getPolygon()));
assertTrue("Polygon should be ignored", !mapboxMap.getPolygons().contains(polygonOptions3.getPolygon()));
}));
}
@Test
public void addPolygonsEmpty() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
mapboxMap.addPolygons(new ArrayList<PolygonOptions>());
assertEquals("Polygons size should be 0", 0, mapboxMap.getPolygons().size());
}));
}
@Test
public void addPolygonsSingle() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<PolygonOptions> polygonList = new ArrayList<>();
PolygonOptions polygonOptions = new PolygonOptions().fillColor(Color.BLACK).add(new LatLng());
polygonList.add(polygonOptions);
mapboxMap.addPolygons(polygonList);
assertEquals("Polygons size should be 1", 1, mapboxMap.getPolygons().size());
assertTrue(mapboxMap.getPolygons().contains(polygonOptions.getPolygon()));
}));
}
@Test
public void testAddPolyline() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolylineOptions polylineOptions = new PolylineOptions().add(new LatLng());
Polyline polyline = mapboxMap.addPolyline(polylineOptions);
assertTrue("Polyline should be contained", mapboxMap.getPolylines().contains(polyline));
}));
}
@Test
public void testAddEmptyPolyline() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolylineOptions polylineOptions = new PolylineOptions();
Polyline polyline = mapboxMap.addPolyline(polylineOptions);
assertTrue("Polyline should be ignored", !mapboxMap.getPolylines().contains(polyline));
}));
}
@Test
public void testAddPolylines() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<PolylineOptions> polylineList = new ArrayList<>();
PolylineOptions polygonOptions1 = new PolylineOptions().color(Color.BLACK).add(new LatLng());
PolylineOptions polygonOptions2 = new PolylineOptions().color(Color.WHITE).add(new LatLng());
PolylineOptions polygonOptions3 = new PolylineOptions();
polylineList.add(polygonOptions1);
polylineList.add(polygonOptions2);
polylineList.add(polygonOptions3);
mapboxMap.addPolylines(polylineList);
assertEquals("Polygons size should be 2", 2, mapboxMap.getPolylines().size());
assertTrue(mapboxMap.getPolylines().contains(polygonOptions1.getPolyline()));
assertTrue(mapboxMap.getPolylines().contains(polygonOptions2.getPolyline()));
assertTrue(
"Polyline should be ignored", !mapboxMap.getPolylines().contains(polygonOptions3.getPolyline())
);
}));
}
@Test
public void testAddPolylinesEmpty() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
mapboxMap.addPolylines(new ArrayList<PolylineOptions>());
assertEquals("Polygons size should be 0", 0, mapboxMap.getPolylines().size());
}));
}
@Test
public void testAddPolylinesSingle() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<PolylineOptions> polylineList = new ArrayList<>();
PolylineOptions polygonOptions = new PolylineOptions().color(Color.BLACK).add(new LatLng());
polylineList.add(polygonOptions);
mapboxMap.addPolylines(polylineList);
assertEquals("Polygons size should be 1", 1, mapboxMap.getPolylines().size());
assertTrue(mapboxMap.getPolylines().contains(polygonOptions.getPolyline()));
}));
}
@Test
public void testRemoveMarker() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker = mapboxMap.addMarker(markerOptions);
mapboxMap.removeMarker(marker);
assertTrue("Markers should be empty", mapboxMap.getMarkers().isEmpty());
}));
}
@Test
public void testRemovePolygon() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolygonOptions polygonOptions = new PolygonOptions();
Polygon polygon = mapboxMap.addPolygon(polygonOptions);
mapboxMap.removePolygon(polygon);
assertTrue("Polygons should be empty", mapboxMap.getPolylines().isEmpty());
}));
}
@Test
public void testRemovePolyline() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
PolylineOptions polylineOptions = new PolylineOptions();
Polyline polyline = mapboxMap.addPolyline(polylineOptions);
mapboxMap.removePolyline(polyline);
assertTrue("Polylines should be empty", mapboxMap.getPolylines().isEmpty());
}));
}
@Test
public void testRemoveAnnotation() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker = mapboxMap.addMarker(markerOptions);
mapboxMap.removeAnnotation(marker);
assertTrue("Annotations should be empty", mapboxMap.getAnnotations().isEmpty());
}));
}
@Test
public void testRemoveAnnotationById() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
mapboxMap.addMarker(markerOptions);
// id will always be 0 in unit tests
mapboxMap.removeAnnotation(0);
assertTrue("Annotations should be empty", mapboxMap.getAnnotations().isEmpty());
}));
}
@Test
public void testRemoveAnnotations() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
MarkerOptions markerOptions1 = new MarkerOptions().title("a").position(new LatLng());
MarkerOptions markerOptions2 = new MarkerOptions().title("b").position(new LatLng());
markerList.add(markerOptions1);
markerList.add(markerOptions2);
mapboxMap.addMarkers(markerList);
mapboxMap.removeAnnotations();
assertTrue("Annotations should be empty", mapboxMap.getAnnotations().isEmpty());
}));
}
@Test
public void testClear() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
MarkerOptions markerOptions1 = new MarkerOptions().title("a").position(new LatLng());
MarkerOptions markerOptions2 = new MarkerOptions().title("b").position(new LatLng());
markerList.add(markerOptions1);
markerList.add(markerOptions2);
mapboxMap.addMarkers(markerList);
mapboxMap.clear();
assertTrue("Annotations should be empty", mapboxMap.getAnnotations().isEmpty());
}));
}
@Test
public void testRemoveAnnotationsByList() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
List<BaseMarkerOptions> markerList = new ArrayList<>();
MarkerOptions markerOptions1 = new MarkerOptions().title("a").position(new LatLng());
MarkerOptions markerOptions2 = new MarkerOptions().title("b").position(new LatLng());
markerList.add(markerOptions1);
markerList.add(markerOptions2);
List<Marker> markers = mapboxMap.addMarkers(markerList);
Marker marker = mapboxMap.addMarker(new MarkerOptions().position(new LatLng()).title("c"));
mapboxMap.removeAnnotations(markers);
assertTrue("Annotations should not be empty", mapboxMap.getAnnotations().size() == 1);
assertTrue("Marker should be contained", mapboxMap.getAnnotations().contains(marker));
}));
}
@Test
public void testGetAnnotationById() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker initialMarker = mapboxMap.addMarker(markerOptions);
Marker retrievedMarker = (Marker) mapboxMap.getAnnotation(0);
assertEquals("Markers should match", initialMarker, retrievedMarker);
}));
}
@Test
public void testGetAnnotations() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(
new MapboxMapAction((uiController, view) ->
assertNotNull("Annotations should be non null", mapboxMap.getAnnotations()))
);
}
@Test
public void testGetMarkers() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(
new MapboxMapAction((uiController, view) ->
assertNotNull("Markers should be non null", mapboxMap.getMarkers()))
);
}
@Test
public void testGetPolygons() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) ->
assertNotNull("Polygons should be non null", mapboxMap.getPolygons()))
);
}
@Test
public void testGetPolylines() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) ->
assertNotNull("Polylines should be non null", mapboxMap.getPolylines()))
);
}
@Test
public void testGetSelectedMarkers() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) ->
assertNotNull("Selected markers should be non null", mapboxMap.getSelectedMarkers()))
);
}
@Test
public void testSelectMarker() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker = mapboxMap.addMarker(markerOptions);
mapboxMap.selectMarker(marker);
assertTrue("Marker should be contained", mapboxMap.getSelectedMarkers().contains(marker));
}));
}
@Test
public void testDeselectMarker() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker = mapboxMap.addMarker(markerOptions);
mapboxMap.selectMarker(marker);
mapboxMap.deselectMarker(marker);
assertTrue("Selected markers should be empty", mapboxMap.getSelectedMarkers().isEmpty());
}));
}
@Test
public void testDeselectMarkers() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
MarkerOptions markerOptions = new MarkerOptions().position(new LatLng());
Marker marker1 = mapboxMap.addMarker(markerOptions);
Marker marker2 = mapboxMap.addMarker(markerOptions);
mapboxMap.selectMarker(marker1);
mapboxMap.selectMarker(marker2);
mapboxMap.deselectMarkers();
assertTrue("Selected markers should be empty", mapboxMap.getSelectedMarkers().isEmpty());
}));
}
public class MapboxMapAction implements ViewAction {
private InvokeViewAction invokeViewAction;
MapboxMapAction(InvokeViewAction invokeViewAction) {
this.invokeViewAction = invokeViewAction;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
invokeViewAction.onViewAction(uiController, view);
}
}
interface InvokeViewAction {
void onViewAction(UiController uiController, View view);
}
}

View File

@@ -0,0 +1,111 @@
package com.mapbox.mapboxsdk.maps;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.AppCenter;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.exceptions.MapboxConfigurationException;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertSame;
import static junit.framework.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public class MapboxTest extends AppCenter {
private static final String ACCESS_TOKEN = "pk.0000000001";
private static final String ACCESS_TOKEN_2 = "pk.0000000002";
@Rule
public ExpectedException expectedException = ExpectedException.none();
private String realToken;
@Before
public void setup() {
realToken = Mapbox.getAccessToken();
}
@Test
@UiThreadTest
public void testConnected() {
assertTrue(Mapbox.isConnected());
// test manual connectivity
Mapbox.setConnected(true);
assertTrue(Mapbox.isConnected());
Mapbox.setConnected(false);
assertFalse(Mapbox.isConnected());
// reset to Android connectivity
Mapbox.setConnected(null);
assertTrue(Mapbox.isConnected());
}
@Test
@UiThreadTest
public void setAccessToken() {
Mapbox.setAccessToken(ACCESS_TOKEN);
assertSame(ACCESS_TOKEN, Mapbox.getAccessToken());
Mapbox.setAccessToken(ACCESS_TOKEN_2);
assertSame(ACCESS_TOKEN_2, Mapbox.getAccessToken());
}
@Test
@UiThreadTest
public void setInvalidAccessToken() {
final String invalidAccessToken = "xyz";
expectedException.expect(MapboxConfigurationException.class);
expectedException.expectMessage(
"A valid access token parameter is required when using a Mapbox service."
+ "\nPlease see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one."
+ "\nMore information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens."
+ "Currently provided token is: " + invalidAccessToken
);
Mapbox.setAccessToken(invalidAccessToken);
assertNull(Mapbox.getTelemetry());
Mapbox.getSkuToken();
}
@Test
@UiThreadTest
public void setNullAccessToken() {
expectedException.expect(MapboxConfigurationException.class);
expectedException.expectMessage(
"A valid access token parameter is required when using a Mapbox service."
+ "\nPlease see https://www.mapbox.com/help/create-api-access-token/ to learn how to create one."
+ "\nMore information in this guide https://www.mapbox.com/help/first-steps-android-sdk/#access-tokens."
+ "Currently provided token is: " + null
);
Mapbox.setAccessToken(null);
assertNull(Mapbox.getTelemetry());
Mapbox.getSkuToken();
}
@Test
@UiThreadTest
public void setValidAccessToken() {
final String invalidAccessToken = "xyz";
Mapbox.setAccessToken(invalidAccessToken);
Mapbox.setAccessToken(ACCESS_TOKEN);
assertNotNull(Mapbox.getTelemetry());
assertNotNull(Mapbox.getSkuToken());
}
@After
public void tearDown() {
Mapbox.setAccessToken(realToken);
}
}

View File

@@ -0,0 +1,439 @@
package com.mapbox.mapboxsdk.maps
import android.content.Context
import android.graphics.PointF
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.geometry.LatLngBounds
import com.mapbox.mapboxsdk.geometry.ProjectedMeters
import com.mapbox.mapboxsdk.maps.renderer.MapRenderer
import com.mapbox.mapboxsdk.style.layers.TransitionOptions
import com.mapbox.mapboxsdk.testapp.utils.TestConstants
import junit.framework.Assert.*
import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class NativeMapViewTest : AppCenter() {
private lateinit var nativeMapView: NativeMap
companion object {
const val DELTA = 0.000001
const val DELTA_BIG = 1.0
const val BEARING_TEST = 60.0
const val PITCH_TEST = 40.0
const val ZOOM_TEST = 16.0
val PADDING_TEST = doubleArrayOf(80.0, 150.0, 0.0, 0.0)
const val WIDTH = 500
const val HEIGHT = WIDTH
val LATLNG_TEST = LatLng(12.0, 34.0)
}
@Before
@UiThreadTest
fun before() {
val context = InstrumentationRegistry.getInstrumentation().context
nativeMapView = NativeMapView(context, 2.0f, false, null, null, DummyRenderer(context))
nativeMapView.resizeView(WIDTH, HEIGHT)
}
@After
@UiThreadTest
fun after() {
nativeMapView.destroy()
}
@Test
@UiThreadTest
fun testSetStyleUrl() {
val expected = Style.DARK
nativeMapView.styleUri = expected
val actual = nativeMapView.styleUri
assertEquals("Style URL should match", expected, actual)
}
@Test
@UiThreadTest
fun testSetStyleJson() {
val expected = "{}"
nativeMapView.styleJson = expected
val actual = nativeMapView.styleJson
assertEquals("Style JSON should match", expected, actual)
}
@Test
@UiThreadTest
fun testBearing() {
val expected = BEARING_TEST
nativeMapView.setBearing(expected, 0)
val actual = nativeMapView.bearing
assertEquals("Bearing should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testLatLng() {
val expected = LATLNG_TEST
nativeMapView.setLatLng(expected, 0)
val actual = nativeMapView.latLng
assertEquals("Latitude should match", expected.latitude, actual.latitude, DELTA)
assertEquals("Longitude should match", expected.longitude, actual.longitude, DELTA)
}
@Test
@UiThreadTest
fun testLatLngPadding() {
val expected = LATLNG_TEST
nativeMapView.contentPadding = PADDING_TEST
nativeMapView.setLatLng(expected, 0)
val actual = nativeMapView.latLng
assertEquals("Latitude should match", expected.latitude, actual.latitude, DELTA)
assertEquals("Longitude should match", expected.longitude, actual.longitude, DELTA)
Assert.assertArrayEquals(PADDING_TEST, nativeMapView.cameraPosition.padding, DELTA)
}
@Test
@UiThreadTest
fun testLatLngDefault() {
val expected = LatLng()
val actual = nativeMapView.latLng
assertEquals("Latitude should match", expected.latitude, actual.latitude, DELTA)
assertEquals("Longitude should match", expected.longitude, actual.longitude, DELTA)
}
@Test
@UiThreadTest
fun testBearingDefault() {
val expected = 0.0
val actual = nativeMapView.bearing
assertEquals("Bearing should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testPitch() {
val expected = PITCH_TEST
nativeMapView.setPitch(expected, 0)
val actual = nativeMapView.pitch
assertEquals("Pitch should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testPitchDefault() {
val expected = 0.0
val actual = nativeMapView.pitch
assertEquals("Pitch should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testZoom() {
val expected = ZOOM_TEST
nativeMapView.setZoom(expected, PointF(0.0f, 0.0f), 0)
val actual = nativeMapView.zoom
assertEquals("Zoom should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testZoomDefault() {
val expected = 0.0
val actual = nativeMapView.zoom
assertEquals("Zoom should match", expected, actual, DELTA)
}
@Test
@UiThreadTest
fun testJumpTo() {
val expected = CameraPosition.Builder()
.bearing(BEARING_TEST)
.target(LATLNG_TEST)
.tilt(PITCH_TEST)
.zoom(ZOOM_TEST)
.padding(PADDING_TEST)
.build()
// verify that the lazily set padding is ignored when a value is provided with the camera
nativeMapView.contentPadding = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
nativeMapView.jumpTo(LATLNG_TEST, ZOOM_TEST, PITCH_TEST, BEARING_TEST, PADDING_TEST)
val actual = nativeMapView.cameraPosition
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, DELTA)
assertEquals("Bearing should match", expected.bearing, actual.bearing, DELTA)
assertEquals("Pitch should match", expected.tilt, actual.tilt, DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, DELTA)
Assert.assertArrayEquals(expected.padding, actual.padding, DELTA)
}
@Test
@UiThreadTest
fun testLatLngForPixel() {
val expected = LATLNG_TEST
nativeMapView.setLatLng(LATLNG_TEST, 0)
val actual = nativeMapView.latLngForPixel(
PointF((WIDTH / 2).toFloat(), (HEIGHT / 2).toFloat())
)
assertEquals("Latitude should match", expected.latitude, actual.latitude, DELTA_BIG)
assertEquals("Longitude should match", expected.longitude, actual.longitude, DELTA_BIG)
}
@Test
@UiThreadTest
fun testPixelForLatLng() {
val expected = PointF((WIDTH / 2).toFloat(), (HEIGHT / 2).toFloat())
nativeMapView.setLatLng(LATLNG_TEST, 0)
val actual = nativeMapView.pixelForLatLng(LATLNG_TEST)
assertEquals("X should match", expected.x.toDouble(), actual.x.toDouble(), DELTA_BIG)
assertEquals("Y should match", expected.y.toDouble(), actual.y.toDouble(), DELTA_BIG)
}
@Test
@UiThreadTest
fun testPrefetchTilesTrue() {
val expected = true
nativeMapView.prefetchTiles = true
val actual = nativeMapView.prefetchTiles
assertEquals("Flag should match", expected, actual)
}
@Test
@UiThreadTest
fun testPrefetchTilesFalse() {
val expected = false
nativeMapView.prefetchTiles = false
val actual = nativeMapView.prefetchTiles
assertEquals("Flag should match", expected, actual)
}
@Test
@UiThreadTest
fun testPrefetchTilesDefault() {
val expected = true
val actual = nativeMapView.prefetchTiles
assertEquals("Flag should match", expected, actual)
}
@Test
@UiThreadTest
fun testPrefetchZoomDelta() {
val expected = 2
nativeMapView.prefetchZoomDelta = 2
val actual = nativeMapView.prefetchZoomDelta
assertEquals("Prefetch zoom delta should match", expected, actual)
}
@Test
@UiThreadTest
fun testPrefetchZoomDeltaDefault() {
val expected = 4
val actual = nativeMapView.prefetchZoomDelta
assertEquals("Prefetch zoom delta should match", expected, actual)
}
@Test
@UiThreadTest
fun testSetContentPadding() {
val expected = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
nativeMapView.contentPadding = expected
val actual = nativeMapView.contentPadding
assertEquals("Left should match", expected[0], actual[0])
assertEquals("Top should match", expected[1], actual[1])
assertEquals("Right should match", expected[2], actual[2])
assertEquals("Bottom should match", expected[3], actual[3])
}
@Test
@UiThreadTest
fun testSetMinZoom() {
val expected = 12.0
nativeMapView.minZoom = expected
val actual = nativeMapView.minZoom
assertEquals("Min zoom should match", expected, actual)
}
@Test
@UiThreadTest
fun testSetMaxZoom() {
val expected = 12.0
nativeMapView.maxZoom = expected
val actual = nativeMapView.maxZoom
assertEquals("Max zoom should match", expected, actual)
}
@Test
@UiThreadTest
fun testSetMinPitch() {
val expected = 60.0
nativeMapView.minPitch = expected
val actual = nativeMapView.minPitch
assertEquals("Min Pitch should match", expected, actual, 0.01)
}
@Test
@UiThreadTest
fun testSetMaxPitch() {
val expected = 60.0
nativeMapView.maxPitch = expected
val actual = nativeMapView.maxPitch
assertEquals("Max Pitch should match", expected, actual, 0.01)
}
@Test
@UiThreadTest
fun testGetProjectedMetersAtLatitude() {
val expected = 77973.67021115532
val actual = nativeMapView.getMetersPerPixelAtLatitude(5.0)
assertEquals("Get projected meters should match", expected, actual)
}
@Test
@UiThreadTest
fun testLatLngForProjectedMeters() {
val expected = LatLng(0.01796630538796444, 0.02694945852363162)
val actual = nativeMapView.latLngForProjectedMeters(ProjectedMeters(2000.0, 3000.0))
assertEquals("Lat for projected meters", expected.latitude, actual.latitude, DELTA)
assertEquals("Lng for projected meters", expected.longitude, actual.longitude, DELTA)
}
@Test
@UiThreadTest
fun testFlyTo() {
val expected = CameraPosition.Builder()
.zoom(12.0)
.tilt(30.0)
.target(LatLng(12.0, 14.0))
.bearing(20.0)
.padding(PADDING_TEST)
.build()
// verify that the lazily set padding is ignored when a value is provided with the camera
nativeMapView.contentPadding = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
nativeMapView.flyTo(expected.target, expected.zoom, expected.bearing, expected.tilt, PADDING_TEST, 0)
val actual = nativeMapView.cameraPosition
assertEquals("Bearing should match", expected.bearing, actual.bearing, TestConstants.BEARING_DELTA)
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Tilt should match", expected.tilt, actual.tilt, TestConstants.TILT_DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, TestConstants.ZOOM_DELTA)
Assert.assertArrayEquals(expected.padding, actual.padding, DELTA)
}
@Test
@UiThreadTest
fun testEaseTo() {
val expected = CameraPosition.Builder()
.zoom(12.0)
.tilt(30.0)
.target(LatLng(12.0, 14.0))
.bearing(20.0)
.padding(PADDING_TEST)
.build()
// verify that the lazily set padding is ignored when a value is provided with the camera
nativeMapView.contentPadding = doubleArrayOf(1.0, 2.0, 3.0, 4.0)
nativeMapView.easeTo(expected.target, expected.zoom, expected.bearing, expected.tilt, PADDING_TEST, 0, false)
val actual = nativeMapView.cameraPosition
assertEquals("Bearing should match", expected.bearing, actual.bearing, TestConstants.BEARING_DELTA)
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Tilt should match", expected.tilt, actual.tilt, TestConstants.TILT_DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, TestConstants.ZOOM_DELTA)
Assert.assertArrayEquals(expected.padding, actual.padding, DELTA)
}
@Test
@UiThreadTest
fun testResetPosition() {
val expected = CameraPosition.Builder()
.zoom(0.0)
.tilt(0.0)
.target(LatLng(0.0, 0.0))
.bearing(0.0)
.padding(PADDING_TEST)
.build()
nativeMapView.jumpTo(LatLng(1.0, 2.0), 12.0, 23.0, 1.0, PADDING_TEST)
nativeMapView.resetPosition()
val actual = nativeMapView.cameraPosition
assertEquals("Bearing should match", expected.bearing, actual.bearing, TestConstants.BEARING_DELTA)
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Tilt should match", expected.tilt, actual.tilt, TestConstants.TILT_DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, TestConstants.ZOOM_DELTA)
Assert.assertArrayEquals(expected.padding, actual.padding, DELTA)
}
@Test
@UiThreadTest
fun testGetCameraForLatLngBounds() {
val expected = CameraPosition.Builder()
.zoom(3.5258764777024005)
.tilt(0.0)
.target(LatLng(23.182767623652808, 13.999999999994088))
.bearing(0.0)
.build()
val actual = nativeMapView.getCameraForLatLngBounds(
LatLngBounds.from(30.0, 16.0, 16.0, 12.0),
intArrayOf(0, 0, 0, 0),
0.0,
0.0
)
assertEquals("Bearing should match", expected.bearing, actual.bearing, TestConstants.BEARING_DELTA)
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Tilt should match", expected.tilt, actual.tilt, TestConstants.TILT_DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, TestConstants.ZOOM_DELTA)
}
@Test
@UiThreadTest
fun testMoveBy() {
val expected = CameraPosition.Builder()
.zoom(0.0)
.tilt(0.0)
.target(LatLng(4.21494310024160, -4.218749958739409))
.bearing(0.0)
.build()
nativeMapView.moveBy(12.0, 12.0, 0)
val actual = nativeMapView.cameraPosition
assertEquals("Bearing should match", expected.bearing, actual.bearing, TestConstants.BEARING_DELTA)
assertEquals("Latitude should match", expected.target.latitude, actual.target.latitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Longitude should match", expected.target.longitude, actual.target.longitude, TestConstants.LAT_LNG_DELTA)
assertEquals("Tilt should match", expected.tilt, actual.tilt, TestConstants.TILT_DELTA)
assertEquals("Zoom should match", expected.zoom, actual.zoom, TestConstants.ZOOM_DELTA)
}
@Test
@UiThreadTest
fun testTransitionOptions() {
val transitionOptions = TransitionOptions(500, 500)
nativeMapView.transitionOptions = transitionOptions
assertTrue(transitionOptions.isEnablePlacementTransitions)
assertEquals(transitionOptions, nativeMapView.transitionOptions)
}
@Test
@UiThreadTest
fun testTransitionOptions_disablePlacementTransitions() {
val transitionOptions = TransitionOptions(500, 500, false)
nativeMapView.transitionOptions = transitionOptions
assertFalse(transitionOptions.isEnablePlacementTransitions)
assertEquals(transitionOptions, nativeMapView.transitionOptions)
}
class DummyRenderer(context: Context) : MapRenderer(context, null) {
override fun requestRender() {
// no-op
}
override fun queueEvent(runnable: Runnable?) {
// no-op
}
}
}

View File

@@ -0,0 +1,33 @@
package com.mapbox.mapboxsdk.maps
import androidx.test.espresso.UiController
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest
import org.junit.Assert.assertEquals
import org.junit.Test
class TransformTest : EspressoTest() {
companion object {
val initialCameraUpdate = CameraUpdateFactory.newLatLngZoom(LatLng(12.0, 12.0), 12.0)!!
}
@Test
fun mapboxMapScrollByWithPadding() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.scrollBy(400.0f, 0.0f)
val expectedCameraPosition = mapboxMap.cameraPosition
mapboxMap.moveCamera(initialCameraUpdate)
mapboxMap.setPadding(250, 250, 0, 0)
mapboxMap.scrollBy(400.0f, 0.0f)
val actualCameraPosition = mapboxMap.cameraPosition
assertEquals("Camera position should match", expectedCameraPosition, actualCameraPosition)
}
}
}

View File

@@ -0,0 +1,518 @@
package com.mapbox.mapboxsdk.maps
import android.graphics.PointF
import androidx.test.espresso.UiController
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.geometry.LatLngBounds
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
import com.mapbox.mapboxsdk.testapp.activity.BaseTest
import com.mapbox.mapboxsdk.testapp.activity.espresso.PixelTestActivity
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test
class VisibleRegionTest : BaseTest() {
override fun getActivityClass(): Class<*> {
return PixelTestActivity::class.java
}
override
fun beforeTest() {
super.beforeTest()
mapView = (rule.activity as PixelTestActivity).mapView
}
@Test
fun visibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngs.all { visibleRegion.latLngBounds.contains(it) })
}
}
@Test
fun paddedVisibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(
mapView.width / 4,
mapView.height / 4,
mapView.width / 4,
mapView.height / 4)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 1)
assertTrue(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)))
}
}
@Test
fun paddedLeftVisibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(mapView.width / 4, 0, 0, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f)))
}
}
@Test
fun paddedTopVisibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, mapView.height / 4, 0, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f)))
}
}
@Test
fun paddedRightVisibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, 0, mapView.width / 4, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)))
}
}
@Test
fun paddedBottomVisibleRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, 0, 0, mapView.height / 4)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat())))
}
}
@Test
fun visibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngs.all { visibleRegion.latLngBounds.contains(it) })
}
}
@Test
fun paddedVisibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(
mapView.width / 4,
mapView.height / 4,
mapView.width / 4,
mapView.height / 4)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 1)
assertTrue(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)))
}
}
@Test
fun paddedLeftVisibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(mapView.width / 4, 0, 0, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f)))
}
}
@Test
fun paddedTopVisibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { ui: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
ui.loopMainThreadForAtLeast(5000)
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, mapView.height / 4, 0, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f)))
}
}
@Test
fun paddedRightVisibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, 0, mapView.width / 4, 0)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)))
}
}
@Test
fun paddedBottomVisibleRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
mapboxMap.setPadding(0, 0, 0, mapView.height / 4)
val visibleRegion = mapboxMap.projection.getVisibleRegion(false)
val filtered = latLngs.filter { visibleRegion.latLngBounds.contains(it) }
assertTrue(filtered.size == 6)
assertFalse(filtered.contains(mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat())))
}
}
@Test
fun visibleRotatedRegionTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val d = Math.min(mapboxMap.width, mapboxMap.height) / 4
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f - d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f + d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f - d / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f + d / 2f)
)
for (bearing in 45 until 360 step 45) {
mapboxMap.moveCamera(CameraUpdateFactory.bearingTo(bearing.toDouble()))
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngs.all { visibleRegion.latLngBounds.contains(it) })
}
}
}
@Test
fun visibleRotatedRegionOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val d = Math.min(mapboxMap.width, mapboxMap.height) / 4
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f - d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f + d / 2f, mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f - d / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f + d / 2f)
)
for (bearing in 45 until 360 step 45) {
mapboxMap.moveCamera(CameraUpdateFactory.bearingTo(bearing.toDouble()))
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngs.all { visibleRegion.latLngBounds.contains(it) })
}
}
}
@Test
fun visibleRegionWithBoundsEqualTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
val bounds = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapboxMap.projection.getVisibleCoordinateBounds(bounds)
val latLngBounds = LatLngBounds.from(bounds[0], bounds[1], bounds[2], bounds[3])
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngBounds == visibleRegion.latLngBounds)
assertTrue(latLngs.all { latLngBounds.contains(it) })
}
}
@Test
fun visibleRegionBoundsOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(0f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, 0f),
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), 0f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height / 2f)
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width.toFloat(), mapView.height.toFloat())
.also { it.longitude += 360 },
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height.toFloat()),
mapboxMap.getLatLngFromScreenCoords(0f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f)
)
val bounds = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapboxMap.projection.getVisibleCoordinateBounds(bounds)
val latLngBounds = LatLngBounds.from(bounds[0], bounds[1], bounds[2], bounds[3])
assertTrue(latLngs.all { latLngBounds.contains(it) })
}
}
@Test
fun visibleRegionBoundsOverDatelineLatitudeZeroTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 180.0), 8.0))
val shift = mapboxMap.getLatLngFromScreenCoords(0f, 0f)
mapboxMap.moveCamera(CameraUpdateFactory.newLatLng(LatLng(0.0, 180.0 - shift.longitude)))
val bounds = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapboxMap.projection.getVisibleCoordinateBounds(bounds)
val latLngBounds = LatLngBounds.from(bounds[0], bounds[1], bounds[2], bounds[3])
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngBounds == visibleRegion.latLngBounds)
}
}
@Test
fun visibleRotatedRegionBoundEqualTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 0.0), 8.0))
val d = Math.min(mapboxMap.width, mapboxMap.height) / 4
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f - d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f + d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f - d / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f + d / 2f)
)
for (bearing in 45 until 360 step 45) {
mapboxMap.moveCamera(CameraUpdateFactory.bearingTo(bearing.toDouble()))
val bounds = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapboxMap.projection.getVisibleCoordinateBounds(bounds)
val latLngBounds = LatLngBounds.from(bounds[0], bounds[1], bounds[2], bounds[3])
val visibleRegion = mapboxMap.projection.visibleRegion
assertTrue(latLngBounds == visibleRegion.latLngBounds)
assertTrue(latLngs.all { latLngBounds.contains(it) })
}
}
}
@Test
fun visibleRotatedRegionBoundsOverDatelineTest() {
validateTestSetup()
invoke(mapboxMap) { _: UiController, mapboxMap: MapboxMap ->
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 179.0), 8.0))
val d = Math.min(mapboxMap.width, mapboxMap.height) / 4
val latLngs = listOf(
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f - d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f + d / 2f, mapView.height / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f - d / 2f),
mapboxMap.getLatLngFromScreenCoords(mapView.width / 2f, mapView.height / 2f + d / 2f)
)
for (bearing in 45 until 360 step 45) {
mapboxMap.moveCamera(CameraUpdateFactory.bearingTo(bearing.toDouble()))
val bounds = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapboxMap.projection.getVisibleCoordinateBounds(bounds)
val latLngBounds = LatLngBounds.from(bounds[0], bounds[1], bounds[2], bounds[3])
assertTrue(latLngs.all { latLngBounds.contains(it) })
}
}
}
private fun MapboxMap.getLatLngFromScreenCoords(x: Float, y: Float): LatLng {
return this.projection.fromScreenLocation(PointF(x, y))
}
}

View File

@@ -0,0 +1,85 @@
package com.mapbox.mapboxsdk.offline
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.geojson.Point
import com.mapbox.mapboxsdk.log.Logger
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Integration test that validates downloading an offline region from a point geometry at zoomlevel 17
*/
@RunWith(AndroidJUnit4::class)
class OfflineDownloadTest : OfflineRegion.OfflineRegionObserver {
@Rule
@JvmField
var rule = ActivityTestRule(FeatureOverviewActivity::class.java)
private val countDownLatch = CountDownLatch(1)
private lateinit var offlineRegion: OfflineRegion
@Test(timeout = 60000)
fun offlineDownload() {
rule.runOnUiThreadActivity {
OfflineManager.getInstance(rule.activity).createOfflineRegion(
createTestRegionDefinition(),
ByteArray(0),
object : OfflineManager.CreateOfflineRegionCallback {
override fun onCreate(region: OfflineRegion) {
offlineRegion = region
offlineRegion.setDownloadState(OfflineRegion.STATE_ACTIVE)
offlineRegion.setObserver(this@OfflineDownloadTest)
}
override fun onError(error: String) {
Logger.e(TAG, "Error while creating offline region: $error")
}
})
}
if (!countDownLatch.await(60, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
override fun onStatusChanged(status: OfflineRegionStatus) {
Logger.i(TAG, "Download percentage ${100.0 * status.completedResourceCount / status.requiredResourceCount}")
if (status.isComplete) {
offlineRegion.setDownloadState(OfflineRegion.STATE_INACTIVE)
countDownLatch.countDown()
}
}
override fun onError(error: OfflineRegionError) {
Logger.e(TAG, "Error while downloading offline region: $error")
}
override fun mapboxTileCountLimitExceeded(limit: Long) {
Logger.e(TAG, "Tile count limited exceeded: $limit")
}
private fun createTestRegionDefinition(): OfflineRegionDefinition {
return OfflineGeometryRegionDefinition(
Style.MAPBOX_STREETS,
Point.fromLngLat(50.847857, 4.360137),
17.0,
17.0,
1.0f,
false
)
}
companion object {
const val TAG = "OfflineDownloadTest"
}
}
fun ActivityTestRule<*>.runOnUiThreadActivity(runnable: () -> Unit) = activity.runOnUiThread(runnable)

View File

@@ -0,0 +1,61 @@
package com.mapbox.mapboxsdk.snapshotter
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.style.layers.BackgroundLayer
import com.mapbox.mapboxsdk.style.layers.PropertyFactory
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import junit.framework.Assert.assertNotNull
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Integration test that validates if a snapshotter creation
*/
@RunWith(AndroidJUnit4::class)
class MapSnapshotterTest {
@Rule
@JvmField
var rule = ActivityTestRule(FeatureOverviewActivity::class.java)
private val countDownLatch = CountDownLatch(1)
@Test
fun mapSnapshotter() {
var mapSnapshotter: MapSnapshotter?
rule.activity.runOnUiThread {
val bg = BackgroundLayer("rand_tint")
bg.setProperties(PropertyFactory.backgroundColor("rgba(255,128,0,0.7)"))
val options = MapSnapshotter.Options(512, 512)
.withPixelRatio(1.0f)
.withStyleBuilder(Style.Builder().fromUri(Style.SATELLITE_STREETS)
.withLayerAbove(bg, "country-label"))
.withCameraPosition(
CameraPosition.Builder()
.zoom(12.0)
.target(LatLng(51.145495, 5.742234))
.build()
)
mapSnapshotter = MapSnapshotter(rule.activity, options)
mapSnapshotter!!.start({
assertNotNull(it)
assertNotNull(it.bitmap)
countDownLatch.countDown()
}, {
Assert.fail(it)
})
}
if (!countDownLatch.await(30, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
}

View File

@@ -0,0 +1,50 @@
package com.mapbox.mapboxsdk.testapp.action;
import androidx.annotation.NonNull;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import android.view.View;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import org.hamcrest.Matcher;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
public class MapboxMapAction implements ViewAction {
private OnInvokeActionListener invokeViewAction;
private MapboxMap mapboxMap;
public MapboxMapAction(OnInvokeActionListener invokeViewAction, MapboxMap mapboxMap) {
this.invokeViewAction = invokeViewAction;
this.mapboxMap = mapboxMap;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
invokeViewAction.onInvokeAction(uiController, mapboxMap);
}
public static void invoke(MapboxMap mapboxMap, OnInvokeActionListener invokeViewAction) {
onView(withId(android.R.id.content)).perform(new MapboxMapAction(invokeViewAction, mapboxMap));
}
public interface OnInvokeActionListener {
void onInvokeAction(@NonNull UiController uiController, @NonNull MapboxMap mapboxMap);
}
}

View File

@@ -0,0 +1,78 @@
package com.mapbox.mapboxsdk.testapp.action;
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.ActivityInfo;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import android.view.View;
import android.view.ViewGroup;
import org.hamcrest.Matcher;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
public class OrientationAction implements ViewAction {
private final int orientation;
private OrientationAction(int orientation) {
this.orientation = orientation;
}
public static ViewAction orientationLandscape() {
return new OrientationAction(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
public static ViewAction orientationPortrait() {
return new OrientationAction(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
public static ViewAction orientationLandscapeReverse() {
return new OrientationAction(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
}
public static ViewAction orientationPortraitReverse() {
return new OrientationAction(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
}
@Override
public Matcher<View> getConstraints() {
return isRoot();
}
@Override
public String getDescription() {
return "change orientation to " + orientation;
}
@Override
public void perform(UiController uiController, View view) {
uiController.loopMainThreadUntilIdle();
Activity activity = getActivity(view.getContext());
if (activity == null && view instanceof ViewGroup) {
ViewGroup v = (ViewGroup) view;
int c = v.getChildCount();
for (int i = 0; i < c && activity == null; ++i) {
activity = getActivity(v.getChildAt(i).getContext());
}
}
activity.setRequestedOrientation(orientation);
}
public static void invoke(ViewAction action) {
onView(isRoot()).perform(action);
}
private Activity getActivity(Context context) {
while (context instanceof ContextWrapper) {
if (context instanceof Activity) {
return (Activity) context;
}
context = ((ContextWrapper) context).getBaseContext();
}
return null;
}
}

View File

@@ -0,0 +1,39 @@
package com.mapbox.mapboxsdk.testapp.action;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import android.view.View;
import org.hamcrest.Matcher;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
public final class WaitAction implements ViewAction {
private final long loopTime;
public WaitAction(long loopTime) {
this.loopTime = loopTime;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
uiController.loopMainThreadForAtLeast(loopTime);
}
public static void invoke(long loopTime) {
onView(isRoot()).perform(new WaitAction(loopTime));
}
}

View File

@@ -0,0 +1,113 @@
package com.mapbox.mapboxsdk.testapp.activity;
import android.content.Context;
import androidx.annotation.CallSuper;
import androidx.annotation.UiThread;
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
import com.mapbox.mapboxsdk.AppCenter;
import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.testapp.R;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestName;
import timber.log.Timber;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertTrue;
/**
* Base class for all Activity test hooking into an existing Activity that will load style.
*/
public abstract class BaseTest extends AppCenter {
private static final int WAIT_TIMEOUT = 30; //seconds
@Rule
public ActivityTestRule rule = new ActivityTestRule<>(getActivityClass());
@Rule
public TestName testName = new TestName();
@Rule
public GrantPermissionRule grantLocationPermissionRule = GrantPermissionRule
.grant(android.Manifest.permission.ACCESS_FINE_LOCATION);
protected MapboxMap mapboxMap;
protected MapView mapView;
private final CountDownLatch latch = new CountDownLatch(1);
@Before
@CallSuper
public void beforeTest() {
initialiseMap();
holdTestRunnerForStyleLoad();
}
@After
@CallSuper
public void afterTest() {
super.afterTest();
}
@UiThread
@CallSuper
protected void initMap(MapboxMap mapboxMap) {
this.mapboxMap = mapboxMap;
mapboxMap.getStyle(style -> latch.countDown());
}
protected void validateTestSetup() {
if (!Mapbox.isConnected()) {
Timber.e("Not connected to the internet while running test");
}
assertNotNull("MapView isn't initialised", mapView);
assertNotNull("MapboxMap isn't initialised", mapboxMap);
assertNotNull("Style isn't initialised", mapboxMap.getStyle());
assertTrue("Style isn't fully loaded", mapboxMap.getStyle().isFullyLoaded());
}
protected abstract Class getActivityClass();
private void initialiseMap() {
try {
rule.runOnUiThread(() -> {
mapView = rule.getActivity().findViewById(R.id.mapView);
if (mapView != null) {
mapView.getMapAsync(this::initMap);
} else {
Timber.w("Skipping map load test since mapView is not found.");
latch.countDown();
}
});
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
private void holdTestRunnerForStyleLoad() {
boolean interrupted;
try {
interrupted = latch.await(WAIT_TIMEOUT, TimeUnit.SECONDS);
} catch (InterruptedException ignore) {
interrupted = true;
}
if (!interrupted) {
Timber.e("Timeout occurred for %s", testName.getMethodName());
validateTestSetup();
}
}
protected Context getContext() {
return rule.getActivity();
}
}

View File

@@ -0,0 +1,28 @@
package com.mapbox.mapboxsdk.testapp.activity;
import androidx.annotation.UiThread;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.Style;
import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity;
/**
* Base class for all tests using EspressoTestActivity as wrapper.
* <p>
* Loads "assets/streets.json" as style.
* </p>
*/
public class EspressoTest extends BaseTest {
@Override
protected final Class getActivityClass() {
return EspressoTestActivity.class;
}
@UiThread
@Override
protected void initMap(MapboxMap mapboxMap) {
mapboxMap.setStyle(new Style.Builder().fromUri("asset://streets.json"));
super.initMap(mapboxMap);
}
}

View File

@@ -0,0 +1,32 @@
<%
const activity = locals[0];
const subPackage = locals[1];
-%>
// This file is generated. Edit android/platform/scripts/generate-test-code.js, then run `make generate-test-android`.
package com.mapbox.mapboxsdk.testapp.activity.gen.<%- subPackage %>;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.<%- subPackage %>.<%- activity %>;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Sanity test for <%- activity %>
*/
@RunWith(AndroidJUnit4.class)
public class <%- activity %>Test extends BaseTest {
@Test
public void testSanity() {
}
@Override
protected Class getActivityClass() {
return <%- activity %>.class;
}
}

View File

@@ -0,0 +1,138 @@
package com.mapbox.mapboxsdk.testapp.annotations;
import android.app.Activity;
import androidx.test.annotation.UiThreadTest;
import androidx.core.content.res.ResourcesCompat;
import com.mapbox.mapboxsdk.annotations.Icon;
import com.mapbox.mapboxsdk.annotations.IconFactory;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.maps.IconManagerResolver;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.IconUtils;
import org.junit.Before;
import org.junit.Test;
import java.util.Map;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
/**
* Tests integration between Icons and Markers
*/
public class IconTest extends EspressoTest {
private Map<Icon, Integer> iconMap;
@Before
public void beforeTest() {
super.beforeTest();
iconMap = new IconManagerResolver(mapboxMap).getIconMap();
}
@Test
@UiThreadTest
public void testAddSameIconMarker() {
validateTestSetup();
Icon defaultMarker = IconFactory.getInstance(rule.getActivity()).defaultMarker();
mapboxMap.addMarker(new MarkerOptions().position(new LatLng()));
mapboxMap.addMarker(new MarkerOptions().position(new LatLng(1, 1)));
assertEquals(1, iconMap.size());
assertEquals(2, iconMap.get(defaultMarker), 0);
}
@Test
@UiThreadTest
public void testAddDifferentIconMarker() {
validateTestSetup();
Icon icon = IconFactory.getInstance(rule.getActivity()).fromResource(R.drawable.mapbox_logo_icon);
mapboxMap.addMarker(new MarkerOptions().icon(icon).position(new LatLng()));
mapboxMap.addMarker(new MarkerOptions().position(new LatLng(1, 1)));
assertEquals(iconMap.size(), 2);
assertTrue(iconMap.containsKey(icon));
assertTrue(iconMap.get(icon) == 1);
}
@Test
@UiThreadTest
public void testAddRemoveIconMarker() {
validateTestSetup();
Icon icon = IconFactory.getInstance(rule.getActivity()).fromResource(R.drawable.mapbox_logo_icon);
Marker marker = mapboxMap.addMarker(new MarkerOptions().icon(icon).position(new LatLng()));
mapboxMap.addMarker(new MarkerOptions().position(new LatLng(1, 1)));
assertEquals(iconMap.size(), 2);
assertTrue(iconMap.containsKey(icon));
assertTrue(iconMap.get(icon) == 1);
mapboxMap.removeMarker(marker);
assertEquals(iconMap.size(), 1);
assertFalse(iconMap.containsKey(icon));
}
@Test
@UiThreadTest
public void testAddRemoveDefaultMarker() {
validateTestSetup();
Marker marker = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(1, 1)));
assertEquals(iconMap.size(), 1);
mapboxMap.removeMarker(marker);
assertEquals(iconMap.size(), 0);
mapboxMap.addMarker(new MarkerOptions().position(new LatLng()));
assertEquals(iconMap.size(), 1);
}
@Test
@UiThreadTest
public void testAddRemoveMany() {
validateTestSetup();
Activity activity = rule.getActivity();
IconFactory iconFactory = IconFactory.getInstance(activity);
// add 2 default icon markers
Marker defaultMarkerOne = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(1, 1)));
Marker defaultMarkerTwo = mapboxMap.addMarker(new MarkerOptions().position(new LatLng(2, 1)));
// add 4 unique icon markers
mapboxMap.addMarker(new MarkerOptions()
.icon(iconFactory.fromResource(R.drawable.mapbox_logo_icon))
.position(new LatLng(3, 1))
);
mapboxMap.addMarker(new MarkerOptions()
.icon(iconFactory.fromResource(R.drawable.mapbox_compass_icon))
.position(new LatLng(4, 1))
);
mapboxMap.addMarker(new MarkerOptions()
.icon(IconUtils.drawableToIcon(activity, R.drawable.ic_stars,
ResourcesCompat.getColor(activity.getResources(),
R.color.blueAccent, activity.getTheme())))
.position(new LatLng(5, 1))
);
mapboxMap.addMarker(new MarkerOptions()
.icon(iconFactory.fromResource(R.drawable.ic_android))
.position(new LatLng(6, 1))
);
assertEquals("Amount of icons should match 5", 5, iconMap.size());
assertEquals("Refcounter of default marker should match 2", 2, iconMap.get(iconFactory.defaultMarker()), 0);
mapboxMap.removeMarker(defaultMarkerOne);
assertEquals("Amount of icons should match 5", 5, iconMap.size());
assertEquals("Refcounter of default marker should match 1", 1, iconMap.get(iconFactory.defaultMarker()), 0);
mapboxMap.removeMarker(defaultMarkerTwo);
assertEquals("Amount of icons should match 4", 4, iconMap.size());
assertNull("DefaultMarker shouldn't exist anymore", iconMap.get(iconFactory.defaultMarker()));
mapboxMap.clear();
assertEquals("Amount of icons should match 0", 0, iconMap.size());
}
}

View File

@@ -0,0 +1,63 @@
package com.mapbox.mapboxsdk.testapp.annotations;
import com.mapbox.mapboxsdk.annotations.Marker;
import com.mapbox.mapboxsdk.annotations.MarkerOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.TestConstants;
import org.junit.Ignore;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertEquals;
public class MarkerTest extends EspressoTest {
private Marker marker;
@Test
@Ignore
public void addMarkerTest() {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
assertEquals("Markers should be empty", 0, mapboxMap.getMarkers().size());
MarkerOptions options = new MarkerOptions();
options.setPosition(new LatLng());
options.setSnippet(TestConstants.TEXT_MARKER_SNIPPET);
options.setTitle(TestConstants.TEXT_MARKER_TITLE);
marker = mapboxMap.addMarker(options);
assertEquals("Markers size should be 1, ", 1, mapboxMap.getMarkers().size());
assertEquals("Marker id should be 0", 0, marker.getId());
assertEquals("Marker target should match", new LatLng(), marker.getPosition());
assertEquals("Marker snippet should match", TestConstants.TEXT_MARKER_SNIPPET, marker.getSnippet());
assertEquals("Marker target should match", TestConstants.TEXT_MARKER_TITLE, marker.getTitle());
mapboxMap.clear();
assertEquals("Markers should be empty", 0, mapboxMap.getMarkers().size());
});
}
@Test
@Ignore
public void showInfoWindowTest() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
final MarkerOptions options = new MarkerOptions();
options.setPosition(new LatLng());
options.setSnippet(TestConstants.TEXT_MARKER_SNIPPET);
options.setTitle(TestConstants.TEXT_MARKER_TITLE);
marker = mapboxMap.addMarker(options);
mapboxMap.selectMarker(marker);
});
onView(withText(TestConstants.TEXT_MARKER_TITLE)).check(matches(isDisplayed()));
onView(withText(TestConstants.TEXT_MARKER_SNIPPET)).check(matches(isDisplayed()));
}
}

View File

@@ -0,0 +1,46 @@
package com.mapbox.mapboxsdk.testapp.annotations;
import android.graphics.Color;
import com.mapbox.mapboxsdk.annotations.Polygon;
import com.mapbox.mapboxsdk.annotations.PolygonOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.junit.Ignore;
import org.junit.Test;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertEquals;
public class PolygonTest extends EspressoTest {
@Test
@Ignore
public void addPolygonTest() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLngOne = new LatLng();
LatLng latLngTwo = new LatLng(1, 0);
LatLng latLngThree = new LatLng(1, 1);
assertEquals("Polygons should be empty", 0, mapboxMap.getPolygons().size());
final PolygonOptions options = new PolygonOptions();
options.strokeColor(Color.BLUE);
options.fillColor(Color.RED);
options.add(latLngOne);
options.add(latLngTwo);
options.add(latLngThree);
Polygon polygon = mapboxMap.addPolygon(options);
assertEquals("Polygons should be 1", 1, mapboxMap.getPolygons().size());
assertEquals("Polygon id should be 0", 0, polygon.getId());
assertEquals("Polygon points size should match", 3, polygon.getPoints().size());
assertEquals("Polygon stroke color should match", Color.BLUE, polygon.getStrokeColor());
assertEquals("Polygon target should match", Color.RED, polygon.getFillColor());
mapboxMap.clear();
assertEquals("Polygons should be empty", 0, mapboxMap.getPolygons().size());
});
}
}

View File

@@ -0,0 +1,42 @@
package com.mapbox.mapboxsdk.testapp.annotations;
import android.graphics.Color;
import com.mapbox.mapboxsdk.annotations.Polyline;
import com.mapbox.mapboxsdk.annotations.PolylineOptions;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.junit.Ignore;
import org.junit.Test;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertEquals;
public class PolylineTest extends EspressoTest {
@Test
@Ignore
public void addPolylineTest() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLngOne = new LatLng();
LatLng latLngTwo = new LatLng(1, 0);
assertEquals("Polygons should be empty", 0, mapboxMap.getPolygons().size());
final PolylineOptions options = new PolylineOptions();
options.color(Color.BLUE);
options.add(latLngOne);
options.add(latLngTwo);
Polyline polyline = mapboxMap.addPolyline(options);
assertEquals("Polylines should be 1", 1, mapboxMap.getPolylines().size());
assertEquals("Polyline id should be 0", 0, polyline.getId());
assertEquals("Polyline points size should match", 2, polyline.getPoints().size());
assertEquals("Polyline stroke color should match", Color.BLUE, polyline.getColor());
mapboxMap.clear();
assertEquals("Polyline should be empty", 0, mapboxMap.getPolylines().size());
});
}
}

View File

@@ -0,0 +1,11 @@
package com.mapbox.mapboxsdk.testapp.camera;
import com.mapbox.mapboxsdk.camera.CameraUpdate;
import com.mapbox.mapboxsdk.maps.MapboxMap;
public class CameraAnimateTest extends CameraTest {
@Override
void executeCameraMovement(CameraUpdate cameraUpdate, MapboxMap.CancelableCallback callback) {
mapboxMap.animateCamera(cameraUpdate, callback);
}
}

View File

@@ -0,0 +1,12 @@
package com.mapbox.mapboxsdk.testapp.camera;
import com.mapbox.mapboxsdk.camera.CameraUpdate;
import com.mapbox.mapboxsdk.maps.MapboxMap;
public class CameraEaseTest extends CameraTest {
@Override
void executeCameraMovement(CameraUpdate cameraUpdate, MapboxMap.CancelableCallback callback) {
mapboxMap.easeCamera(cameraUpdate, callback);
}
}

View File

@@ -0,0 +1,260 @@
package com.mapbox.mapboxsdk.testapp.camera;
import androidx.annotation.NonNull;
import androidx.test.annotation.UiThreadTest;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.espresso.DeviceIndependentTestActivity;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class CameraForTest extends BaseTest {
@Test
@UiThreadTest
public void testGetCameraForLatLngBounds() {
validateTestSetup();
CameraPosition actualPosition = mapboxMap.getCameraForLatLngBounds(
LatLngBounds.from(10, 10, -10, -10));
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(4.16).tilt(0).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Bearing should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match", expectedPosition.tilt, actualPosition.tilt, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForLatLngBoundsPadding() {
validateTestSetup();
CameraPosition actualPosition = mapboxMap.getCameraForLatLngBounds(
LatLngBounds.from(10, 10, -10, -10), new int[] {5, 5, 5, 5});
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(4.13).tilt(0).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForLatLngBoundsBearing() {
validateTestSetup();
CameraPosition actualPosition = mapboxMap.getCameraForLatLngBounds(
LatLngBounds.from(10, 10, -10, -10), 45, 0);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(3.66).tilt(0).bearing(45).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForLatLngBoundsTilt() {
validateTestSetup();
CameraPosition actualPosition = mapboxMap.getCameraForLatLngBounds(
LatLngBounds.from(10, 10, -10, -10), 0, 45);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng(-0.264576975267, 0)).zoom(4.13).tilt(45).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForLatLngBoundsAll() {
validateTestSetup();
CameraPosition actualPosition = mapboxMap.getCameraForLatLngBounds(
LatLngBounds.from(10, 10, -10, -10), new int[] {5, 5, 5, 5}, 45, 45);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng(-0.3732134634, -0.3713191053)).zoom(3.63).tilt(45).bearing(45).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForGeometry() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(Polygon.fromLngLats(polygonDefinition));
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(4.16).tilt(0).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Bearing should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match", expectedPosition.tilt, actualPosition.tilt, 0.01f);
}
@NonNull
private List<List<Point>> getPolygonDefinition() {
return new ArrayList<List<Point>>() {
{
add(new ArrayList<Point>() {
{
add(Point.fromLngLat(10, 10));
add(Point.fromLngLat(-10, 10));
add(Point.fromLngLat(-10, -10));
add(Point.fromLngLat(10, -10));
}
});
}
};
}
@Test
@UiThreadTest
public void testGetCameraForGeometryPadding() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(Polygon.fromLngLats(polygonDefinition),
new int[] {5, 5, 5, 5});
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(4.13).tilt(0).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForGeometryBearing() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(Polygon.fromLngLats(polygonDefinition), 45, 0);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(3.66).tilt(0).bearing(45).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForGeometryTilt() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(Polygon.fromLngLats(polygonDefinition), 0, 45);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng(-0.2645769752, 0)).zoom(4.13).tilt(45).bearing(0).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForGeometryAll() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(Polygon.fromLngLats(polygonDefinition),
new int[] {5, 5, 5, 5}, 45, 45);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng(-0.373213463, -0.37131910534)).zoom(3.63).tilt(45).bearing(45).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Test
@UiThreadTest
public void testGetCameraForGeometryDeprecatedApi() {
validateTestSetup();
List<List<Point>> polygonDefinition = getPolygonDefinition();
CameraPosition actualPosition = mapboxMap.getCameraForGeometry(
Polygon.fromLngLats(polygonDefinition),
new int[] {5, 5, 5, 5},
45, 0);
CameraPosition expectedPosition = new CameraPosition.Builder()
.target(new LatLng()).zoom(3.63).tilt(0).bearing(45).build();
assertEquals("Latitude should match",
expectedPosition.target.getLatitude(), actualPosition.target.getLatitude(), 0.00001f);
assertEquals("Longitude should match",
expectedPosition.target.getLongitude(), actualPosition.target.getLongitude(), 0.00001f);
assertEquals("Zoom should match",
expectedPosition.zoom, actualPosition.zoom, 0.01f);
assertEquals("Tilt should match",
expectedPosition.tilt, actualPosition.tilt, 0.01f);
assertEquals("Bearing should match",
expectedPosition.bearing, actualPosition.bearing, 0.01f);
}
@Override
protected Class getActivityClass() {
return DeviceIndependentTestActivity.class;
}
}

View File

@@ -0,0 +1,12 @@
package com.mapbox.mapboxsdk.testapp.camera;
import com.mapbox.mapboxsdk.camera.CameraUpdate;
import com.mapbox.mapboxsdk.maps.MapboxMap;
public class CameraMoveTest extends CameraTest {
@Override
void executeCameraMovement(CameraUpdate cameraUpdate, MapboxMap.CancelableCallback callback) {
mapboxMap.moveCamera(cameraUpdate, callback);
}
}

View File

@@ -0,0 +1,307 @@
package com.mapbox.mapboxsdk.testapp.camera;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.camera.CameraUpdate;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.espresso.DeviceIndependentTestActivity;
import com.mapbox.mapboxsdk.testapp.utils.TestConstants;
import org.junit.Assert;
import org.junit.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
public abstract class CameraTest extends BaseTest {
private CountDownLatch latch;
@Override
protected Class getActivityClass() {
return DeviceIndependentTestActivity.class;
}
@Override
public void beforeTest() {
super.beforeTest();
latch = new CountDownLatch(1);
}
@Test
public void testToCameraPositionTarget() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
float zoom = 1.0f;
LatLng moveTarget = new LatLng(1, 1);
CameraPosition initialPosition = new CameraPosition.Builder().target(
new LatLng()).zoom(zoom).bearing(0).tilt(0).padding(new double[4]).build();
CameraPosition cameraPosition = mapboxMap.getCameraPosition();
assertEquals("Default camera position should match default", cameraPosition, initialPosition);
executeCameraMovement(CameraUpdateFactory.newLatLng(moveTarget), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, moveTarget, zoom, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, moveTarget, zoom, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToCameraPositionTargetZoom() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
final float moveZoom = 15.5f;
final LatLng moveTarget = new LatLng(1.0000000001, 1.0000000003);
executeCameraMovement(CameraUpdateFactory.newLatLngZoom(moveTarget, moveZoom),
new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, moveTarget, moveZoom, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, moveTarget, moveZoom, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToCameraPosition() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
final LatLng moveTarget = new LatLng(1.0000000001, 1.0000000003);
final float moveZoom = 15.5f;
final float moveTilt = 45.5f;
final float moveBearing = 12.5f;
final double[] movePadding = new double[] {0, 500, 350, 1};
executeCameraMovement(CameraUpdateFactory.newCameraPosition(
new CameraPosition.Builder()
.target(moveTarget)
.zoom(moveZoom)
.tilt(moveTilt)
.bearing(moveBearing)
.padding(movePadding)
.build()),
new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, moveTarget, moveZoom, moveBearing, moveTilt, movePadding);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, moveTarget, moveZoom, moveBearing, moveTilt, movePadding);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToBounds() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
final LatLng centerBounds = new LatLng(1, 1);
LatLng cornerOne = new LatLng();
LatLng cornerTwo = new LatLng(2, 2);
final LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(cornerOne);
builder.include(cornerTwo);
executeCameraMovement(CameraUpdateFactory.newLatLngBounds(builder.build(), 0),
new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, centerBounds, mapboxMap.getCameraPosition().zoom, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, centerBounds, mapboxMap.getCameraPosition().zoom, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToZoomIn() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
float zoom = 1.0f;
executeCameraMovement(CameraUpdateFactory.zoomIn(), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom + 1, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom + 1, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToZoomOut() throws InterruptedException {
float zoom = 10.0f;
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
executeCameraMovement(CameraUpdateFactory.newLatLngZoom(new LatLng(), zoom), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
latch = new CountDownLatch(1);
invoke(mapboxMap, (uiController, mapboxMap) -> {
executeCameraMovement(CameraUpdateFactory.zoomOut(), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom - 1, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom - 1, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToZoomBy() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
float zoom = 1.0f;
final float zoomBy = 2.45f;
executeCameraMovement(CameraUpdateFactory.zoomBy(zoomBy), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom + zoomBy, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoom + zoomBy, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
@Test
public void testToZoomTo() throws InterruptedException {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
final float zoomTo = 2.45f;
executeCameraMovement(CameraUpdateFactory.zoomTo(zoomTo), new MapboxMap.CancelableCallback() {
@Override
public void onCancel() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoomTo, 0, 0, new double[4]);
latch.countDown();
}
@Override
public void onFinish() {
verifyCameraPosition(mapboxMap, mapboxMap.getCameraPosition().target, zoomTo, 0, 0, new double[4]);
latch.countDown();
}
});
});
if (!latch.await(10, TimeUnit.SECONDS)) {
Assert.fail("timeout");
}
}
abstract void executeCameraMovement(CameraUpdate cameraUpdate, MapboxMap.CancelableCallback callback);
private void verifyCameraPosition(MapboxMap mapboxMap, LatLng moveTarget, double moveZoom, double moveBearing,
double moveTilt, double[] padding) {
CameraPosition cameraPosition = mapboxMap.getCameraPosition();
assertEquals("Moved camera position latitude should match", cameraPosition.target.getLatitude(),
moveTarget.getLatitude(), TestConstants.LAT_LNG_DELTA);
assertEquals("Moved camera position longitude should match", cameraPosition.target.getLongitude(),
moveTarget.getLongitude(), TestConstants.LAT_LNG_DELTA);
assertEquals("Moved zoom should match", cameraPosition.zoom, moveZoom, TestConstants.ZOOM_DELTA);
assertEquals("Moved zoom should match", cameraPosition.tilt, moveTilt, TestConstants.TILT_DELTA);
assertEquals("Moved bearing should match", cameraPosition.bearing, moveBearing, TestConstants.BEARING_DELTA);
assertArrayEquals("Moved padding should match", cameraPosition.padding, padding, TestConstants.PADDING_DELTA);
}
}

View File

@@ -0,0 +1,35 @@
package com.mapbox.mapboxsdk.testapp.fragment
import androidx.test.espresso.Espresso
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.maplayout.MapInDialogActivity
import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
/**
* Regression test that validates that a map inside a DialogFragment can be opened and closed.
*/
@RunWith(AndroidJUnit4::class)
@LargeTest
class MapDialogFragmentTest : AppCenter() {
@get:Rule
var activityRule: ActivityTestRule<MapInDialogActivity> = ActivityTestRule(MapInDialogActivity::class.java)
@Test
@Ignore
fun openCloseDialog() {
onView(withId(R.id.button_open_dialog)).perform(click())
Thread.sleep(2500)
Espresso.pressBack()
}
}

View File

@@ -0,0 +1,148 @@
package com.mapbox.mapboxsdk.testapp.geometry;
import androidx.test.annotation.UiThreadTest;
import com.google.gson.JsonArray;
import com.mapbox.geojson.Feature;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isRoot;
import static com.mapbox.geojson.Feature.fromGeometry;
import static com.mapbox.geojson.FeatureCollection.fromFeatures;
import static com.mapbox.geojson.GeometryCollection.fromGeometries;
import static com.mapbox.geojson.LineString.fromLngLats;
import static com.mapbox.geojson.MultiLineString.fromLineString;
import static com.mapbox.geojson.MultiPolygon.fromPolygon;
import static java.util.Collections.emptyList;
import static java.util.Collections.singletonList;
import static org.junit.Assert.assertFalse;
/**
* Instrumentation test to validate java geojson conversion to c++
*/
public class GeoJsonConversionTest extends EspressoTest {
// Regression test for #12343
@Test
@UiThreadTest
public void testEmptyFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(fromGeometries(emptyList()))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testPointFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(Point.fromLngLat(0.0, 0.0))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testMultiPointFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(fromLngLats(emptyList()))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testPolygonFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(Polygon.fromLngLats(emptyList()))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testMultiPolygonFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(fromPolygon(Polygon.fromLngLats(emptyList())))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testLineStringFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(fromLngLats(emptyList()))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
@UiThreadTest
public void testMultiLineStringFeatureCollection() {
validateTestSetup();
mapboxMap.getStyle().addSource(
new GeoJsonSource("test-id",
fromFeatures(singletonList(fromGeometry(fromLineString(fromLngLats(emptyList())))))
)
);
mapboxMap.getStyle().addLayer(new SymbolLayer("test-id", "test-id"));
}
@Test
public void testNegativeNumberPropertyConversion() {
validateTestSetup();
onView(isRoot()).perform(new MapboxMapAction((uiController, mapboxMap) -> {
LatLng latLng = new LatLng();
Feature feature = Feature.fromGeometry(Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()));
JsonArray foregroundJsonArray = new JsonArray();
foregroundJsonArray.add(0f);
foregroundJsonArray.add(-3f);
feature.addProperty("property", foregroundJsonArray);
GeoJsonSource source = new GeoJsonSource("source", feature);
mapboxMap.getStyle().addSource(source);
SymbolLayer layer = new SymbolLayer("layer", "source")
.withProperties(
PropertyFactory.iconOffset(Expression.get("property")),
PropertyFactory.iconImage("zoo-15")
);
mapboxMap.getStyle().addLayer(layer);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng)).isEmpty());
}, mapboxMap));
}
}

View File

@@ -0,0 +1,65 @@
package com.mapbox.mapboxsdk.testapp.geometry;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.geometry.LatLngBounds;
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.feature.QueryRenderedFeaturesBoxHighlightActivity;
import com.mapbox.mapboxsdk.testapp.utils.TestConstants;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
/**
* Instrumentation test to validate integration of LatLngBounds
*/
public class LatLngBoundsTest extends BaseTest {
private static final double MAP_BEARING = 50;
@Override
protected Class getActivityClass() {
return QueryRenderedFeaturesBoxHighlightActivity.class;
}
@Test
public void testLatLngBounds() {
// regression test for #9322
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLngBounds bounds = new LatLngBounds.Builder()
.include(new LatLng(48.8589506, 2.2773457))
.include(new LatLng(47.2383171, -1.6309316))
.build();
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
});
}
@Test
public void testLatLngBoundsBearing() {
// regression test for #12549
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLngBounds bounds = new LatLngBounds.Builder()
.include(new LatLng(48.8589506, 2.2773457))
.include(new LatLng(47.2383171, -1.6309316))
.build();
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
mapboxMap.moveCamera(CameraUpdateFactory.bearingTo(MAP_BEARING));
assertEquals(
"Initial bearing should match for latlngbounds",
mapboxMap.getCameraPosition().bearing,
MAP_BEARING,
TestConstants.BEARING_DELTA
);
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0));
assertEquals("Bearing should match after resetting latlngbounds",
mapboxMap.getCameraPosition().bearing,
MAP_BEARING,
TestConstants.BEARING_DELTA);
});
}
}

View File

@@ -0,0 +1,155 @@
package com.mapbox.mapboxsdk.testapp.maps
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.maps.MapView
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import junit.framework.Assert.assertEquals
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ImageMissingTest : AppCenter() {
@Rule
@JvmField
var rule = ActivityTestRule(EspressoTestActivity::class.java)
private lateinit var mapView: MapView
private lateinit var latch: CountDownLatch
@Before
fun setup() {
latch = CountDownLatch(1)
}
@Test
fun testMissingImage() {
rule.runOnUiThread {
initMap(styleJson).addOnStyleImageMissingListener {
assertEquals("missing-icon", it)
latch.countDown()
}
}
if (!latch.await(10, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
@Test
fun testMissingImage_invalidSprite() {
rule.runOnUiThread {
initMap(styleJsonInvalidSprite).addOnStyleImageMissingListener {
assertEquals("missing-icon", it)
latch.countDown()
}
}
if (!latch.await(10, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
private fun initMap(style: String): MapView {
mapView = rule.activity.findViewById(R.id.mapView)
mapView.getMapAsync { it.setStyle(Style.Builder().fromJson(style)) }
return mapView
}
companion object {
private const val styleJson = """
{
"version": 8,
"name": "Mapbox Streets",
"sprite": "mapbox://sprites/mapbox/streets-v8",
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
"sources": {
"point": {
"type": "geojson",
"data": {
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}
}
},
"layers": [{
"id": "bg",
"type": "background",
"paint": {
"background-color": "#f00"
}
}, {
"id": "point",
"type": "circle",
"source": "point",
"paint": {
"circle-radius": 100
}
}, {
"id": "icon",
"type": "symbol",
"source": "point",
"layout": {
"icon-image": "missing-icon"
}
}]
}
"""
private const val styleJsonInvalidSprite = """
{
"version": 8,
"name": "Mapbox Streets",
"sprite": "asset://sprites/mapbox/invalid",
"glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf",
"sources": {
"point": {
"type": "geojson",
"data": {
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [0, 0]
}
}
}
},
"layers": [{
"id": "bg",
"type": "background",
"paint": {
"background-color": "#f00"
}
}, {
"id": "point",
"type": "circle",
"source": "point",
"paint": {
"circle-radius": 100
}
}, {
"id": "icon",
"type": "symbol",
"source": "point",
"layout": {
"icon-image": "missing-icon"
}
}]
}
"""
}
}

View File

@@ -0,0 +1,163 @@
package com.mapbox.mapboxsdk.testapp.maps
import android.graphics.Bitmap
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapView
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import org.junit.Assert.*
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class RemoveUnusedImagesTest : AppCenter() {
@Rule
@JvmField
var rule = ActivityTestRule(EspressoTestActivity::class.java)
private lateinit var mapView: MapView
private lateinit var mapboxMap: MapboxMap
private val latch = CountDownLatch(1)
@Before
fun setup() {
rule.runOnUiThread {
mapView = rule.activity.findViewById(R.id.mapView)
mapView.getMapAsync {
mapboxMap = it
mapboxMap.setStyle(Style.Builder().fromJson(styleJson))
}
}
}
@Test
fun testRemoveUnusedImagesUserProvidedListener() {
var callbackLatch = CountDownLatch(2)
rule.runOnUiThread {
mapView.addOnStyleImageMissingListener {
mapboxMap.style!!.addImage(it, Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888))
}
// Remove layer and source, so that rendered tiles are no longer used, therefore, map must
// notify client about unused images.
mapView.addOnDidBecomeIdleListener {
mapboxMap.style!!.removeLayer("icon")
mapboxMap.style!!.removeSource("geojson")
}
mapView.addOnCanRemoveUnusedStyleImageListener {
callbackLatch.countDown()
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 120.0), 8.0))
mapView.addOnDidFinishRenderingFrameListener {
assertNotNull(mapboxMap.style!!.getImage("small"))
assertNotNull(mapboxMap.style!!.getImage("large"))
latch.countDown()
}
return@addOnCanRemoveUnusedStyleImageListener false
}
}
if (!latch.await(5, TimeUnit.SECONDS) && !callbackLatch.await(5, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
@Test
fun testRemoveUnusedImagesDefaultListener() {
rule.runOnUiThread {
mapView.addOnStyleImageMissingListener {
mapboxMap.style!!.addImage(it, Bitmap.createBitmap(512, 512, Bitmap.Config.ARGB_8888))
}
// Remove layer and source, so that rendered tiles are no longer used, thus
// map must request removal of unused images.
mapView.addOnDidBecomeIdleListener {
mapboxMap.style!!.removeLayer("icon")
mapboxMap.style!!.removeSource("geojson")
mapboxMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(0.0, 120.0), 8.0))
// Wait for the next frame and check that images were removed from the style.
mapView.addOnDidFinishRenderingFrameListener {
if (mapboxMap.style!!.getImage("small") == null && mapboxMap.style!!.getImage("large") == null) {
latch.countDown()
}
}
}
}
if (!latch.await(5, TimeUnit.SECONDS)) {
throw TimeoutException()
}
}
companion object {
private const val styleJson = """
{
"version": 8,
"name": "Mapbox Streets",
"sources": {
"geojson": {
"type": "geojson",
"data": {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"image": "small"
},
"geometry": {
"type": "Point",
"coordinates": [
0,
0
]
}
},
{
"type": "Feature",
"properties": {
"image": "large"
},
"geometry": {
"type": "Point",
"coordinates": [
1,
1
]
}
}
]
}
}
},
"layers": [{
"id": "bg",
"type": "background",
"paint": {
"background-color": "#f00"
}
},{
"id": "icon",
"type": "symbol",
"source": "geojson",
"layout": {
"icon-image": ["get", "image"]
}
}]
}
"""
}
}

View File

@@ -0,0 +1,51 @@
package com.mapbox.mapboxsdk.testapp.maps
import android.view.TextureView
import android.view.ViewGroup
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.maps.MapView
import com.mapbox.mapboxsdk.maps.MapboxMapOptions
import com.mapbox.mapboxsdk.maps.renderer.glsurfaceview.MapboxGLSurfaceView
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import java.util.concurrent.CountDownLatch
import junit.framework.Assert.assertNotNull
import junit.framework.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class RenderViewGetterTest : AppCenter() {
@Rule
@JvmField
var rule = ActivityTestRule(FeatureOverviewActivity::class.java)
private lateinit var rootView: ViewGroup
private lateinit var mapView: MapView
private val latch: CountDownLatch = CountDownLatch(1)
@Test
@UiThreadTest
fun testGLSurfaceView() {
rootView = rule.activity.findViewById(android.R.id.content)
mapView = MapView(rule.activity)
assertNotNull(mapView.renderView)
assertTrue(mapView.renderView is MapboxGLSurfaceView)
}
@Test
@UiThreadTest
fun testTextureView() {
rootView = rule.activity.findViewById(android.R.id.content)
mapView = MapView(rule.activity,
MapboxMapOptions.createFromAttributes(rule.activity, null)
.textureMode(true)
)
assertNotNull(mapView.renderView)
assertTrue(mapView.renderView is TextureView)
}
}

View File

@@ -0,0 +1,112 @@
package com.mapbox.mapboxsdk.testapp.maps
import android.graphics.PointF
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.geometry.LatLng
import com.mapbox.mapboxsdk.maps.MapView
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.activity.espresso.DeviceIndependentTestActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ScreenCoordinateConversion : AppCenter() {
@Rule
@JvmField
var rule = ActivityTestRule(DeviceIndependentTestActivity::class.java)
private lateinit var mapView: MapView
private lateinit var latch: CountDownLatch
@Before
fun setup() {
latch = CountDownLatch(1)
}
@Test
fun testToScreenCoordinates() {
rule.runOnUiThread {
mapView = rule.activity.findViewById(R.id.mapView)
val expected = doubleArrayOf(261.6888889445351, 253.15541110551123, 267.37777788907033, 247.4627648056528)
val actual = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapView.getMapAsync {
val projection = it.projection
projection.toScreenLocations(doubleArrayOf(1.0, 2.0, 3.0, 4.0), actual)
// check all values
assertTrue(expected.contentEquals(actual))
// check first coordinate value
val pointFirst = PointF(expected[0].toFloat(), expected[1].toFloat())
val convertedFirst = projection.toScreenLocation(LatLng(1.0, 2.0))
assertEquals(
pointFirst.x, convertedFirst.x, DELTA_FLOAT
)
assertEquals(
pointFirst.y, convertedFirst.y, DELTA_FLOAT
)
// check second latlng value
val pointSecond = PointF(expected[2].toFloat(), expected[3].toFloat())
val convertedSecond = projection.toScreenLocation(LatLng(3.0, 4.0))
assertEquals(
pointSecond.x, convertedSecond.x, DELTA_FLOAT
)
assertEquals(
pointSecond.y, convertedSecond.y, DELTA_FLOAT
)
latch.countDown()
}
}
latch.await(10, TimeUnit.SECONDS)
}
@Test
fun testFromScreenCoordinates() {
rule.runOnUiThread {
mapView = rule.activity.findViewById(R.id.mapView)
val expected = doubleArrayOf(66.2314571265913, -89.64843662311537, 65.94647142295494, -88.94531162999371)
val actual = doubleArrayOf(0.0, 0.0, 0.0, 0.0)
mapView.getMapAsync {
val projection = it.projection
projection.fromScreenLocations(doubleArrayOf(1.0, 2.0, 3.0, 4.0), actual)
// check all values at once
assertTrue(expected.contentEquals(actual))
// check first latlng value
val latLngFirst = LatLng(expected[0], expected[1])
val convertedFirst = projection.fromScreenLocation(PointF(1.0f, 2.0f))
assertEquals(
latLngFirst.latitude, convertedFirst.latitude, DELTA_DOUBLE
)
assertEquals(
latLngFirst.longitude, convertedFirst.longitude, DELTA_DOUBLE
)
// check second latlng value
val latLngSecond = LatLng(expected[2], expected[3])
val convertedSecond = projection.fromScreenLocation(PointF(3.0f, 4.0f))
assertEquals(
latLngSecond.latitude, convertedSecond.latitude, DELTA_DOUBLE
)
assertEquals(
latLngSecond.longitude, convertedSecond.longitude, DELTA_DOUBLE
)
latch.countDown()
}
}
latch.await(10, TimeUnit.SECONDS)
}
companion object {
const val DELTA_DOUBLE = 0.000001
const val DELTA_FLOAT = 0.000001f
}
}

View File

@@ -0,0 +1,31 @@
package com.mapbox.mapboxsdk.testapp.maps
import androidx.test.espresso.UiController
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.mapbox.mapboxsdk.maps.MapboxMap
import com.mapbox.mapboxsdk.maps.Style
import com.mapbox.mapboxsdk.style.layers.SymbolLayer
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class StyleLoadTest : EspressoTest() {
@Test
fun updateSourceAfterStyleLoad() {
validateTestSetup()
MapboxMapAction.invoke(mapboxMap) { uiController: UiController, mapboxMap: MapboxMap ->
val source = GeoJsonSource("id")
val layer = SymbolLayer("id", "id")
mapboxMap.setStyle(Style.Builder().withSource(source).withLayer(layer))
TestingAsyncUtils.waitForLayer(uiController, mapView)
mapboxMap.setStyle(Style.Builder().fromUrl(Style.MAPBOX_STREETS))
TestingAsyncUtils.waitForLayer(uiController, mapView)
source.setGeoJson("{}")
}
}
}

View File

@@ -0,0 +1,219 @@
package com.mapbox.mapboxsdk.testapp.maps.widgets;
import android.app.Instrumentation;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.espresso.intent.Intents;
import android.text.Html;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.URLSpan;
import android.view.View;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.style.sources.Source;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onData;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.intent.Intents.intended;
import static androidx.test.espresso.intent.Intents.intending;
import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction;
import static androidx.test.espresso.intent.matcher.IntentMatchers.hasData;
import static androidx.test.espresso.matcher.RootMatchers.isDialog;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withTagValue;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.anything;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assume.assumeTrue;
public class AttributionTest extends EspressoTest {
private URLSpan[] urlSpans;
@Before
public void beforeTest() {
super.beforeTest();
Intents.init();
}
@Test
public void testDisabled() {
validateTestSetup();
// Default
onView(withTagValue(is("attrView"))).check(matches(isDisplayed()));
// Disabled
onView(withTagValue(is("attrView")))
.perform(new DisableAction(mapboxMap))
.check(matches(not(isDisplayed())));
}
@Test
@Ignore
public void testMapboxStreetsMapboxAttributionLink() {
validateTestSetup();
if (urlSpans == null) {
buildUrlSpans();
}
// click on View to open dialog
onView(withTagValue(is("attrView"))).perform(click());
onView(withText(R.string.mapbox_attributionsDialogTitle)).check(matches(isDisplayed()));
// test for trigger url intent
Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_VIEW), hasData(Uri.parse(urlSpans[0].getURL())));
intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
// click item and test for url
onData(anything()).inAdapterView(withId(R.id.select_dialog_listview)).atPosition(0).perform(click());
intended(expectedIntent);
}
@Test
@Ignore
public void testMapboxStreetsOpenStreetMapAttributionLink() {
validateTestSetup();
if (urlSpans == null) {
buildUrlSpans();
}
// click on View to open dialog
onView(withTagValue(is("attrView"))).perform(click());
onView(withText(R.string.mapbox_attributionsDialogTitle)).check(matches(isDisplayed()));
// test for trigger url intent
Matcher<Intent> expectedIntent = allOf(hasAction(Intent.ACTION_VIEW), hasData(Uri.parse(urlSpans[1].getURL())));
intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
// click item and test for url
onData(anything()).inAdapterView(withId(R.id.select_dialog_listview)).atPosition(1).perform(click());
intended(expectedIntent);
}
@Test
@Ignore
public void testImproveMapLink() {
validateTestSetup();
if (urlSpans == null) {
buildUrlSpans();
}
// click on View to open dialog
onView(withTagValue(is("attrView"))).perform(click());
onView(withText(R.string.mapbox_attributionsDialogTitle)).check(matches(isDisplayed()));
// test for trigger url intent
Matcher<Intent> expectedIntent = hasAction(Intent.ACTION_VIEW);
intending(expectedIntent).respondWith(new Instrumentation.ActivityResult(0, null));
// click item and test for url
onData(anything()).inAdapterView(withId(R.id.select_dialog_listview)).atPosition(2).perform(click());
intended(expectedIntent);
}
@Test
public void testTelemetryDialog() {
assumeTrue(
"Can only run on API Level 23 or newer because of instability",
Build.VERSION.SDK_INT >= 23
);
validateTestSetup();
// click on View to open dialog
onView(withTagValue(is("attrView"))).perform(click());
onView(withText(R.string.mapbox_attributionsDialogTitle)).inRoot(isDialog()).check(matches(isDisplayed()));
// click on item to open second dialog
onView(withText(R.string.mapbox_telemetrySettings)).inRoot(isDialog()).perform(click());
onView(withText(R.string.mapbox_attributionTelemetryTitle)).inRoot(isDialog()).check(matches(isDisplayed()));
}
@After
public void afterTest() {
super.afterTest();
Intents.release();
}
private void buildUrlSpans() {
onView(withId(R.id.mapView)).perform(new MapboxMapAction((uiController, view) -> {
for (Source source : mapboxMap.getStyle().getSources()) {
String attributionSource = source.getAttribution();
if (!TextUtils.isEmpty(attributionSource)) {
SpannableStringBuilder htmlBuilder = (SpannableStringBuilder) Html.fromHtml(attributionSource);
urlSpans = htmlBuilder.getSpans(0, htmlBuilder.length(), URLSpan.class);
}
}
}));
}
private class DisableAction implements ViewAction {
private MapboxMap mapboxMap;
DisableAction(MapboxMap map) {
mapboxMap = map;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
mapboxMap.getUiSettings().setAttributionEnabled(false);
}
}
private class MapboxMapAction implements ViewAction {
private InvokeViewAction invokeViewAction;
MapboxMapAction(InvokeViewAction invokeViewAction) {
this.invokeViewAction = invokeViewAction;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
invokeViewAction.onViewAction(uiController, view);
}
}
interface InvokeViewAction {
void onViewAction(UiController uiController, View view);
}
}

View File

@@ -0,0 +1,68 @@
package com.mapbox.mapboxsdk.testapp.maps.widgets;
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.testapp.action.WaitAction;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.TestConstants;
import org.junit.Ignore;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withTagValue;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.junit.Assert.assertEquals;
public class CompassViewTest extends EspressoTest {
@Test
public void testDefault() {
validateTestSetup();
onView(withTagValue(is("compassView"))).check(matches(not(isDisplayed())));
}
@Test
@Ignore
public void testVisible() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(
new CameraPosition.Builder()
.bearing(45)
.zoom(1)
.target(new LatLng())
.build()
));
uiController.loopMainThreadForAtLeast(500);
});
onView(withTagValue(is("compassView"))).check(matches(isDisplayed()));
}
@Test
@Ignore
public void testClick() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> mapboxMap.moveCamera(CameraUpdateFactory.newCameraPosition(
new CameraPosition.Builder()
.bearing(45)
.zoom(1)
.target(new LatLng())
.build()
)));
onView(withTagValue(is("compassView"))).perform(click());
WaitAction.invoke(500);
onView(withTagValue(is("compassView"))).check(matches(not(isDisplayed())));
invoke(mapboxMap, (uiController, mapboxMap) -> {
CameraPosition cameraPosition = mapboxMap.getCameraPosition();
assertEquals("Camera bearing should face north, ", 0, cameraPosition.bearing, TestConstants.BEARING_DELTA);
});
}
}

View File

@@ -0,0 +1,61 @@
package com.mapbox.mapboxsdk.testapp.maps.widgets;
import android.view.View;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.hamcrest.Matcher;
import org.junit.Test;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withTagValue;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
public class LogoTest extends EspressoTest {
@Test
public void testDefault() {
validateTestSetup();
onView(withTagValue(is("logoView"))).check(matches(isDisplayed()));
}
@Test
public void testDisabled() {
validateTestSetup();
onView(withTagValue(is("logoView")))
.perform(new DisableAction(mapboxMap))
.check(matches(not(isDisplayed())));
}
private class DisableAction implements ViewAction {
private MapboxMap mapboxMap;
DisableAction(MapboxMap map) {
mapboxMap = map;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
mapboxMap.getUiSettings().setLogoEnabled(false);
}
}
}

View File

@@ -0,0 +1,104 @@
package com.mapbox.mapboxsdk.testapp.offline
import android.content.Context
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.offline.OfflineManager
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import java.util.concurrent.CountDownLatch
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class CacheTest {
@Rule
@JvmField
var rule = ActivityTestRule(FeatureOverviewActivity::class.java)
private val context: Context by lazy { rule.activity }
private val countDownLatch = CountDownLatch(1)
@Test
fun testSetMaximumAmbientCacheSize() {
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).setMaximumAmbientCacheSize(10000000, object : OfflineManager.FileSourceCallback {
override fun onSuccess() {
countDownLatch.countDown()
}
override fun onError(message: String) {
Assert.assertNull("onError should not be called", message)
}
})
}
countDownLatch.await()
}
@Test
fun testSetClearAmbientCache() {
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).clearAmbientCache(object : OfflineManager.FileSourceCallback {
override fun onSuccess() {
countDownLatch.countDown()
}
override fun onError(message: String) {
Assert.assertNull("onError should not be called", message)
}
})
}
countDownLatch.await()
}
@Test
fun testSetInvalidateAmbientCache() {
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).invalidateAmbientCache(object : OfflineManager.FileSourceCallback {
override fun onSuccess() {
countDownLatch.countDown()
}
override fun onError(message: String) {
Assert.assertNull("onError should not be called", message)
}
})
}
countDownLatch.await()
}
@Test
fun testSetResetDatabase() {
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).resetDatabase(object : OfflineManager.FileSourceCallback {
override fun onSuccess() {
countDownLatch.countDown()
}
override fun onError(message: String) {
Assert.assertNull("onError should not be called", message)
}
})
}
countDownLatch.await()
}
@Test
fun testSetPackDatabase() {
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).packDatabase(object : OfflineManager.FileSourceCallback {
override fun onSuccess() {
countDownLatch.countDown()
}
override fun onError(message: String) {
Assert.assertNull("onError should not be called", message)
}
})
}
countDownLatch.await()
}
}

View File

@@ -0,0 +1,124 @@
package com.mapbox.mapboxsdk.testapp.offline
import android.content.Context
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.offline.OfflineManager
import com.mapbox.mapboxsdk.offline.OfflineRegion
import com.mapbox.mapboxsdk.storage.FileSource
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import com.mapbox.mapboxsdk.testapp.utils.FileUtils
import java.io.IOException
import java.util.concurrent.CountDownLatch
import org.junit.FixMethodOrder
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@RunWith(AndroidJUnit4::class)
class OfflineManagerTest : AppCenter() {
companion object {
private const val TEST_DB_FILE_NAME = "offline_test.db"
private lateinit var mergedRegion: OfflineRegion
}
@Rule
@JvmField
var rule = ActivityTestRule(FeatureOverviewActivity::class.java)
private val context: Context by lazy { rule.activity }
@Test(timeout = 30_000)
fun a_copyFileFromAssets() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
FileUtils.CopyFileFromAssetsTask(rule.activity, object : FileUtils.OnFileCopiedFromAssetsListener {
override fun onFileCopiedFromAssets() {
latch.countDown()
}
override fun onError() {
throw IOException("Unable to copy DB file.")
}
}).execute(TEST_DB_FILE_NAME, FileSource.getResourcesCachePath(rule.activity))
}
latch.await()
}
@Test(timeout = 30_000)
fun b_mergeRegion() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).mergeOfflineRegions(
FileSource.getResourcesCachePath(rule.activity) + "/" + TEST_DB_FILE_NAME,
object : OfflineManager.MergeOfflineRegionsCallback {
override fun onMerge(offlineRegions: Array<out OfflineRegion>?) {
assert(offlineRegions?.size == 1)
latch.countDown()
}
override fun onError(error: String?) {
throw RuntimeException("Unable to merge external offline database. $error")
}
})
}
latch.await()
}
@Test(timeout = 30_000)
fun c_listRegion() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
OfflineManager.getInstance(context).listOfflineRegions(object : OfflineManager.ListOfflineRegionsCallback {
override fun onList(offlineRegions: Array<out OfflineRegion>?) {
assert(offlineRegions?.size == 1)
mergedRegion = offlineRegions!![0]
latch.countDown()
}
override fun onError(error: String?) {
throw RuntimeException("Unable to merge external offline database. $error")
}
})
}
latch.await()
}
@Test(timeout = 30_000)
fun d_invalidateRegion() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
mergedRegion.invalidate(object : OfflineRegion.OfflineRegionInvalidateCallback {
override fun onInvalidate() {
latch.countDown()
}
override fun onError(error: String?) {
throw RuntimeException("Unable to delete region")
}
})
}
latch.await()
}
@Test(timeout = 30_000)
fun e_deleteRegion() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
mergedRegion.delete(object : OfflineRegion.OfflineRegionDeleteCallback {
override fun onDelete() {
latch.countDown()
}
override fun onError(error: String?) {
throw RuntimeException("Unable to delete region")
}
})
}
latch.await()
}
}

View File

@@ -0,0 +1,41 @@
package com.mapbox.mapboxsdk.testapp.offline;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.AppCenter;
import com.mapbox.mapboxsdk.testapp.utils.OfflineUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import static com.mapbox.mapboxsdk.testapp.activity.offline.OfflineActivity.JSON_CHARSET;
import static junit.framework.Assert.assertEquals;
import static junit.framework.TestCase.assertTrue;
@RunWith(AndroidJUnit4.class)
public class OfflineUtilsTest extends AppCenter {
private static final String REGION_NAME = "hello world";
private static final String CONVERTED_REGION_NAME = "{\"FIELD_REGION_NAME\":\"hello world\"}";
@Test
public void testOfflineUtilsConvertToBytes() throws UnsupportedEncodingException {
byte[] expected = CONVERTED_REGION_NAME.getBytes(JSON_CHARSET);
byte[] actual = OfflineUtils.convertRegionName(REGION_NAME);
assertTrue("Bytes arrays should match", Arrays.equals(expected, actual));
}
@Test
public void testOfflineUtilsConvertToString() throws UnsupportedEncodingException {
String actual = OfflineUtils.convertRegionName(CONVERTED_REGION_NAME.getBytes(JSON_CHARSET));
assertEquals("Strings should match", REGION_NAME, actual);
}
@Test
public void testOfflineUtilsConvertNoOp() {
String convertNoOp = OfflineUtils.convertRegionName(OfflineUtils.convertRegionName(REGION_NAME));
assertEquals("Strings should match", REGION_NAME, convertNoOp);
}
}

View File

@@ -0,0 +1,74 @@
package com.mapbox.mapboxsdk.testapp.render;
import android.Manifest;
import androidx.test.espresso.IdlingPolicies;
import androidx.test.espresso.IdlingRegistry;
import androidx.test.espresso.IdlingResourceTimeoutException;
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.AppCenter;
import com.mapbox.mapboxsdk.testapp.activity.render.RenderTestActivity;
import com.mapbox.mapboxsdk.testapp.utils.SnapshotterIdlingResource;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import timber.log.Timber;
import java.util.concurrent.TimeUnit;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
/**
* Instrumentation render tests
*/
@RunWith(AndroidJUnit4.class)
public class RenderTest extends AppCenter {
private static final int RENDER_TEST_TIMEOUT = 30;
private SnapshotterIdlingResource idlingResource;
@Rule
public ActivityTestRule<RenderTestActivity> activityRule = new ActivityTestRule<>(RenderTestActivity.class);
@Rule
public GrantPermissionRule writeRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE);
@Rule
public GrantPermissionRule readRule = GrantPermissionRule.grant(Manifest.permission.READ_EXTERNAL_STORAGE);
@Before
public void beforeTest() {
IdlingPolicies.setMasterPolicyTimeout(RENDER_TEST_TIMEOUT, TimeUnit.MINUTES);
setupIdlingResource();
}
private void setupIdlingResource() {
try {
Timber.e("@Before test: register idle resource");
IdlingPolicies.setIdlingResourceTimeout(RENDER_TEST_TIMEOUT, TimeUnit.MINUTES);
IdlingRegistry.getInstance().register(idlingResource = new SnapshotterIdlingResource(activityRule.getActivity()));
} catch (IdlingResourceTimeoutException idlingResourceTimeoutException) {
throw new RuntimeException("Idling out!");
}
}
@Test
@Ignore
public void testRender() {
onView(withId(android.R.id.content)).check(matches(isDisplayed()));
}
@After
public void afterTest() {
Timber.e("@After test: unregister idle resource");
IdlingRegistry.getInstance().unregister(idlingResource);
}
}

View File

@@ -0,0 +1,58 @@
package com.mapbox.mapboxsdk.testapp.storage
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.storage.FileSource
import com.mapbox.mapboxsdk.testapp.activity.espresso.EspressoTestActivity
import java.util.concurrent.CountDownLatch
import junit.framework.Assert
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestName
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
open class FileSourceMapTest : AppCenter() {
private lateinit var fileSourceTestUtils: FileSourceTestUtils
@get:Rule
val rule = ActivityTestRule(EspressoTestActivity::class.java)
@get:Rule
val testName = TestName()
@Before
@UiThreadTest
fun setup() {
fileSourceTestUtils = FileSourceTestUtils(rule.activity)
fileSourceTestUtils.setup()
}
@Test
fun changeResourcesPathWhileMapVisible() {
val latch = CountDownLatch(1)
rule.activity.runOnUiThread {
FileSource.setResourcesCachePath(fileSourceTestUtils.testPath, object : FileSource.ResourcesCachePathChangeCallback {
override fun onSuccess(path: String) {
latch.countDown()
Assert.assertEquals(fileSourceTestUtils.testPath, path)
}
override fun onError(message: String) {
Assert.fail("Resources path can be changed while the map is running")
}
})
}
latch.await()
}
@After
fun cleanup() {
fileSourceTestUtils.cleanup()
}
}

View File

@@ -0,0 +1,110 @@
package com.mapbox.mapboxsdk.testapp.storage
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.ActivityTestRule
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.storage.FileSource
import com.mapbox.mapboxsdk.testapp.activity.FeatureOverviewActivity
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import org.junit.*
import org.junit.rules.TestName
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class FileSourceStandaloneTest : AppCenter() {
private lateinit var fileSourceTestUtils: FileSourceTestUtils
private lateinit var fileSource: FileSource
@get:Rule
val rule = ActivityTestRule(FeatureOverviewActivity::class.java)
@get:Rule
val testName = TestName()
@Before
@UiThreadTest
fun setup() {
fileSource = FileSource.getInstance(rule.activity)
fileSourceTestUtils = FileSourceTestUtils(rule.activity)
fileSourceTestUtils.setup()
}
@Test
@UiThreadTest
fun testDefault() {
Assert.assertTrue("FileSource should be active", fileSource.isActivated)
}
@Test
@UiThreadTest
fun testActivateDeactivate() {
Assert.assertTrue("1) FileSource should be active", fileSource.isActivated)
fileSource.deactivate()
Assert.assertFalse("2) FileSource should not be active", fileSource.isActivated)
fileSource.activate()
Assert.assertTrue("3) FileSource should be active", fileSource.isActivated)
}
@Test
fun pathChangeTest() {
Assert.assertTrue("FileSource should be active", fileSource.isActivated)
Assert.assertEquals(fileSourceTestUtils.originalPath, FileSource.getResourcesCachePath(rule.activity))
fileSourceTestUtils.changePath(fileSourceTestUtils.testPath)
Assert.assertEquals(fileSourceTestUtils.testPath, FileSource.getResourcesCachePath(rule.activity))
Assert.assertTrue("FileSource should be active", fileSource.isActivated)
fileSourceTestUtils.changePath(fileSourceTestUtils.originalPath)
Assert.assertEquals(fileSourceTestUtils.originalPath, FileSource.getResourcesCachePath(rule.activity))
Assert.assertTrue("FileSource should be active", fileSource.isActivated)
}
@Test
fun overridePathChangeCallTest() {
val firstLatch = CountDownLatch(1)
val secondLatch = CountDownLatch(1)
rule.activity.runOnUiThread {
FileSource.setResourcesCachePath(
fileSourceTestUtils.testPath,
object : FileSource.ResourcesCachePathChangeCallback {
override fun onSuccess(path: String) {
Assert.assertEquals(fileSourceTestUtils.testPath, path)
firstLatch.countDown()
}
override fun onError(message: String) {
Assert.fail("First attempt should succeed.")
}
})
FileSource.setResourcesCachePath(
fileSourceTestUtils.testPath2,
object : FileSource.ResourcesCachePathChangeCallback {
override fun onSuccess(path: String) {
Assert.fail("Second attempt should fail because first one is in progress.")
}
override fun onError(message: String) {
Assert.assertEquals("Another resources cache path change is in progress", message)
secondLatch.countDown()
}
})
}
if (!secondLatch.await(5, TimeUnit.SECONDS)) {
Assert.fail("Second attempt should fail.")
}
if (!firstLatch.await(5, TimeUnit.SECONDS)) {
Assert.fail("First attempt should succeed.")
}
}
@After
fun cleanup() {
fileSourceTestUtils.cleanup()
}
}

View File

@@ -0,0 +1,59 @@
package com.mapbox.mapboxsdk.testapp.storage
import android.app.Activity
import androidx.annotation.WorkerThread
import com.mapbox.mapboxsdk.AppCenter
import com.mapbox.mapboxsdk.storage.FileSource
import java.io.File
import java.util.concurrent.CountDownLatch
import junit.framework.Assert
class FileSourceTestUtils(private val activity: Activity) : AppCenter() {
val originalPath = FileSource.getResourcesCachePath(activity)
val testPath = "$originalPath/test"
val testPath2 = "$originalPath/test2"
private val paths = listOf(testPath, testPath2)
fun setup() {
for (path in paths) {
val testFile = File(path)
testFile.mkdirs()
}
}
@WorkerThread
fun cleanup() {
val currentPath = FileSource.getResourcesCachePath(activity)
if (currentPath != originalPath) {
changePath(originalPath)
}
for (path in paths) {
val testFile = File(path)
if (testFile.exists()) {
testFile.deleteRecursively()
}
}
}
@WorkerThread
fun changePath(requestedPath: String) {
val latch = CountDownLatch(1)
activity.runOnUiThread {
FileSource.setResourcesCachePath(
requestedPath,
object : FileSource.ResourcesCachePathChangeCallback {
override fun onSuccess(path: String) {
Assert.assertEquals(requestedPath, path)
latch.countDown()
}
override fun onError(message: String) {
Assert.fail("Resource path change failed - path: $requestedPath, message: $message")
}
})
}
latch.await()
}
}

View File

@@ -0,0 +1,47 @@
package com.mapbox.mapboxsdk.testapp.string;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import org.junit.Test;
import org.junit.runner.RunWith;
import static junit.framework.Assert.assertEquals;
/**
* Test verifying if String#toUpperCase and String#toLowerCase produces desired results
* <p>
* See core test in https://github.com/mapbox/mapbox-gl-native/blob/master/test/util/text_conversions.test.cpp
* </p>
*/
@RunWith(AndroidJUnit4.class)
public class UppperLowerCaseTest extends EspressoTest {
@Test
public void testToUpperCase() {
assertEquals("STREET", "strEEt".toUpperCase()); // EN
assertEquals("ROAD", "rOAd".toUpperCase()); // EN
assertEquals("STRASSE", "straße".toUpperCase()); // DE
assertEquals("MASSE", "maße".toUpperCase()); // DE
assertEquals("WEISSKOPFSEEADLER", "weißkopfseeadler".toUpperCase()); // DE
assertEquals("BÊNÇÃO", "bênção".toUpperCase()); // PT
assertEquals("AZƏRBAYCAN", "Azərbaycan".toUpperCase()); // AZ
assertEquals("ὈΔΥΣΣΕΎΣ", "Ὀδυσσεύς".toUpperCase()); // GR
}
@Test
public void testToLowerCase() {
assertEquals("street", "strEEt".toLowerCase()); // EN
assertEquals("road", "rOAd".toLowerCase()); // EN
assertEquals("straße", "Straße".toLowerCase()); // DE
assertEquals("strasse", "STRASSE".toLowerCase()); // DE
assertEquals("masse", "MASSE".toLowerCase()); // DE
assertEquals("weisskopfseeadler", "weiSSkopfseeadler".toLowerCase()); // DE
assertEquals("bênção", "BÊNÇÃO".toLowerCase()); // PT
assertEquals("azərbaycan", "AZƏRBAYCAN".toLowerCase()); //
}
}

View File

@@ -0,0 +1,163 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.BackgroundLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for BackgroundLayer
*/
@RunWith(AndroidJUnit4.class)
public class BackgroundLayerTest extends BaseLayerTest {
private BackgroundLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new BackgroundLayer("my-layer");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testBackgroundColorTransition() {
Timber.i("background-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setBackgroundColorTransition(options);
assertEquals(layer.getBackgroundColorTransition(), options);
}
@Test
@UiThreadTest
public void testBackgroundColorAsConstant() {
Timber.i("background-color");
assertNotNull(layer);
assertNull(layer.getBackgroundColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(backgroundColor(propertyValue));
assertEquals(layer.getBackgroundColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testBackgroundColorAsIntConstant() {
Timber.i("background-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(backgroundColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getBackgroundColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testBackgroundPatternTransition() {
Timber.i("background-patternTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setBackgroundPatternTransition(options);
assertEquals(layer.getBackgroundPatternTransition(), options);
}
@Test
@UiThreadTest
public void testBackgroundPatternAsConstant() {
Timber.i("background-pattern");
assertNotNull(layer);
assertNull(layer.getBackgroundPattern().getValue());
// Set and Get
String propertyValue = "pedestrian-polygon";
layer.setProperties(backgroundPattern(propertyValue));
assertEquals(layer.getBackgroundPattern().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testBackgroundOpacityTransition() {
Timber.i("background-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setBackgroundOpacityTransition(options);
assertEquals(layer.getBackgroundOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testBackgroundOpacityAsConstant() {
Timber.i("background-opacity");
assertNotNull(layer);
assertNull(layer.getBackgroundOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(backgroundOpacity(propertyValue));
assertEquals(layer.getBackgroundOpacity().getValue(), propertyValue);
}
}

View File

@@ -0,0 +1,555 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.CircleLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for CircleLayer
*/
@RunWith(AndroidJUnit4.class)
public class CircleLayerTest extends BaseLayerTest {
private CircleLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new CircleLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testCircleSortKeyAsConstant() {
Timber.i("circle-sort-key");
assertNotNull(layer);
assertNull(layer.getCircleSortKey().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleSortKey(propertyValue));
assertEquals(layer.getCircleSortKey().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleSortKeyAsExpression() {
Timber.i("circle-sort-key-expression");
assertNotNull(layer);
assertNull(layer.getCircleSortKey().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleSortKey(expression));
assertEquals(layer.getCircleSortKey().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleRadiusTransition() {
Timber.i("circle-radiusTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleRadiusTransition(options);
assertEquals(layer.getCircleRadiusTransition(), options);
}
@Test
@UiThreadTest
public void testCircleRadiusAsConstant() {
Timber.i("circle-radius");
assertNotNull(layer);
assertNull(layer.getCircleRadius().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleRadius(propertyValue));
assertEquals(layer.getCircleRadius().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleRadiusAsExpression() {
Timber.i("circle-radius-expression");
assertNotNull(layer);
assertNull(layer.getCircleRadius().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleRadius(expression));
assertEquals(layer.getCircleRadius().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleColorTransition() {
Timber.i("circle-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleColorTransition(options);
assertEquals(layer.getCircleColorTransition(), options);
}
@Test
@UiThreadTest
public void testCircleColorAsConstant() {
Timber.i("circle-color");
assertNotNull(layer);
assertNull(layer.getCircleColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(circleColor(propertyValue));
assertEquals(layer.getCircleColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleColorAsExpression() {
Timber.i("circle-color-expression");
assertNotNull(layer);
assertNull(layer.getCircleColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(circleColor(expression));
assertEquals(layer.getCircleColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleColorAsIntConstant() {
Timber.i("circle-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(circleColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getCircleColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testCircleBlurTransition() {
Timber.i("circle-blurTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleBlurTransition(options);
assertEquals(layer.getCircleBlurTransition(), options);
}
@Test
@UiThreadTest
public void testCircleBlurAsConstant() {
Timber.i("circle-blur");
assertNotNull(layer);
assertNull(layer.getCircleBlur().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleBlur(propertyValue));
assertEquals(layer.getCircleBlur().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleBlurAsExpression() {
Timber.i("circle-blur-expression");
assertNotNull(layer);
assertNull(layer.getCircleBlur().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleBlur(expression));
assertEquals(layer.getCircleBlur().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleOpacityTransition() {
Timber.i("circle-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleOpacityTransition(options);
assertEquals(layer.getCircleOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testCircleOpacityAsConstant() {
Timber.i("circle-opacity");
assertNotNull(layer);
assertNull(layer.getCircleOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleOpacity(propertyValue));
assertEquals(layer.getCircleOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleOpacityAsExpression() {
Timber.i("circle-opacity-expression");
assertNotNull(layer);
assertNull(layer.getCircleOpacity().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleOpacity(expression));
assertEquals(layer.getCircleOpacity().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleTranslateTransition() {
Timber.i("circle-translateTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleTranslateTransition(options);
assertEquals(layer.getCircleTranslateTransition(), options);
}
@Test
@UiThreadTest
public void testCircleTranslateAsConstant() {
Timber.i("circle-translate");
assertNotNull(layer);
assertNull(layer.getCircleTranslate().getValue());
// Set and Get
Float[] propertyValue = new Float[] {0f, 0f};
layer.setProperties(circleTranslate(propertyValue));
assertEquals(layer.getCircleTranslate().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleTranslateAnchorAsConstant() {
Timber.i("circle-translate-anchor");
assertNotNull(layer);
assertNull(layer.getCircleTranslateAnchor().getValue());
// Set and Get
String propertyValue = CIRCLE_TRANSLATE_ANCHOR_MAP;
layer.setProperties(circleTranslateAnchor(propertyValue));
assertEquals(layer.getCircleTranslateAnchor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCirclePitchScaleAsConstant() {
Timber.i("circle-pitch-scale");
assertNotNull(layer);
assertNull(layer.getCirclePitchScale().getValue());
// Set and Get
String propertyValue = CIRCLE_PITCH_SCALE_MAP;
layer.setProperties(circlePitchScale(propertyValue));
assertEquals(layer.getCirclePitchScale().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCirclePitchAlignmentAsConstant() {
Timber.i("circle-pitch-alignment");
assertNotNull(layer);
assertNull(layer.getCirclePitchAlignment().getValue());
// Set and Get
String propertyValue = CIRCLE_PITCH_ALIGNMENT_MAP;
layer.setProperties(circlePitchAlignment(propertyValue));
assertEquals(layer.getCirclePitchAlignment().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleStrokeWidthTransition() {
Timber.i("circle-stroke-widthTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleStrokeWidthTransition(options);
assertEquals(layer.getCircleStrokeWidthTransition(), options);
}
@Test
@UiThreadTest
public void testCircleStrokeWidthAsConstant() {
Timber.i("circle-stroke-width");
assertNotNull(layer);
assertNull(layer.getCircleStrokeWidth().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleStrokeWidth(propertyValue));
assertEquals(layer.getCircleStrokeWidth().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleStrokeWidthAsExpression() {
Timber.i("circle-stroke-width-expression");
assertNotNull(layer);
assertNull(layer.getCircleStrokeWidth().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleStrokeWidth(expression));
assertEquals(layer.getCircleStrokeWidth().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleStrokeColorTransition() {
Timber.i("circle-stroke-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleStrokeColorTransition(options);
assertEquals(layer.getCircleStrokeColorTransition(), options);
}
@Test
@UiThreadTest
public void testCircleStrokeColorAsConstant() {
Timber.i("circle-stroke-color");
assertNotNull(layer);
assertNull(layer.getCircleStrokeColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(circleStrokeColor(propertyValue));
assertEquals(layer.getCircleStrokeColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleStrokeColorAsExpression() {
Timber.i("circle-stroke-color-expression");
assertNotNull(layer);
assertNull(layer.getCircleStrokeColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(circleStrokeColor(expression));
assertEquals(layer.getCircleStrokeColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testCircleStrokeColorAsIntConstant() {
Timber.i("circle-stroke-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(circleStrokeColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getCircleStrokeColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testCircleStrokeOpacityTransition() {
Timber.i("circle-stroke-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setCircleStrokeOpacityTransition(options);
assertEquals(layer.getCircleStrokeOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testCircleStrokeOpacityAsConstant() {
Timber.i("circle-stroke-opacity");
assertNotNull(layer);
assertNull(layer.getCircleStrokeOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(circleStrokeOpacity(propertyValue));
assertEquals(layer.getCircleStrokeOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testCircleStrokeOpacityAsExpression() {
Timber.i("circle-stroke-opacity-expression");
assertNotNull(layer);
assertNull(layer.getCircleStrokeOpacity().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(circleStrokeOpacity(expression));
assertEquals(layer.getCircleStrokeOpacity().getExpression(), expression);
}
}

View File

@@ -0,0 +1,110 @@
package com.mapbox.mapboxsdk.testapp.style
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.matcher.ViewMatchers.isRoot
import com.mapbox.mapboxsdk.style.sources.CustomGeometrySource.THREAD_POOL_LIMIT
import com.mapbox.mapboxsdk.style.sources.CustomGeometrySource.THREAD_PREFIX
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke
import com.mapbox.mapboxsdk.testapp.action.OrientationAction.orientationLandscape
import com.mapbox.mapboxsdk.testapp.action.OrientationAction.orientationPortrait
import com.mapbox.mapboxsdk.testapp.action.WaitAction
import com.mapbox.mapboxsdk.testapp.activity.BaseTest
import com.mapbox.mapboxsdk.testapp.activity.style.GridSourceActivity
import com.mapbox.mapboxsdk.testapp.activity.style.GridSourceActivity.ID_GRID_LAYER
import com.mapbox.mapboxsdk.testapp.activity.style.GridSourceActivity.ID_GRID_SOURCE
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils
import org.junit.Assert
import org.junit.Assert.*
import org.junit.Test
class CustomGeometrySourceTest : BaseTest() {
override fun getActivityClass(): Class<*> = GridSourceActivity::class.java
@Test
fun sourceNotLeakingThreadsTest() {
validateTestSetup()
WaitAction.invoke(4000)
onView(isRoot()).perform(orientationLandscape())
WaitAction.invoke(2000)
onView(isRoot()).perform(orientationPortrait())
WaitAction.invoke(2000)
Assert.assertFalse("Threads should be shutdown when the source is destroyed.",
Thread.getAllStackTraces().keys.filter {
it.name.startsWith(THREAD_PREFIX)
}.count() > THREAD_POOL_LIMIT)
}
@Test
fun threadsShutdownWhenSourceRemovedTest() {
validateTestSetup()
invoke(mapboxMap) { uiController, mapboxMap ->
mapboxMap.style!!.removeLayer(ID_GRID_LAYER)
TestingAsyncUtils.waitForLayer(uiController, mapView)
mapboxMap.style!!.removeSource(ID_GRID_SOURCE)
TestingAsyncUtils.waitForLayer(uiController, mapView)
Assert.assertTrue("There should be no threads running when the source is removed.",
Thread.getAllStackTraces().keys.filter {
it.name.startsWith(THREAD_PREFIX)
}.count() == 0)
}
}
@Test
fun threadsRestartedWhenSourceReAddedTest() {
validateTestSetup()
invoke(mapboxMap) { uiController, mapboxMap ->
mapboxMap.style!!.removeLayer((rule.activity as GridSourceActivity).layer)
TestingAsyncUtils.waitForLayer(uiController, mapView)
mapboxMap.style!!.removeSource(ID_GRID_SOURCE)
TestingAsyncUtils.waitForLayer(uiController, mapView)
mapboxMap.style!!.addSource((rule.activity as GridSourceActivity).source)
mapboxMap.style!!.addLayer((rule.activity as GridSourceActivity).layer)
TestingAsyncUtils.waitForLayer(uiController, mapView)
Assert.assertTrue("Threads should be restarted when the source is re-added to the map.",
Thread.getAllStackTraces().keys.filter {
it.name.startsWith(THREAD_PREFIX)
}.count() == THREAD_POOL_LIMIT)
}
}
@Test
fun sourceZoomDeltaTest() {
validateTestSetup()
invoke(mapboxMap) { uiController, mapboxMap ->
mapboxMap.prefetchZoomDelta = 3
mapboxMap.style!!.getSource(ID_GRID_SOURCE)!!.let {
assertNull(it.prefetchZoomDelta)
it.prefetchZoomDelta = 5
assertNotNull(it.prefetchZoomDelta)
assertEquals(5, it.prefetchZoomDelta!!)
it.prefetchZoomDelta = null
assertNull(it.prefetchZoomDelta)
}
}
}
@Test
fun isVolatileTest() {
validateTestSetup()
invoke(mapboxMap) { uiController, mapboxMap ->
mapboxMap.style!!.getSource(ID_GRID_SOURCE)!!.let {
assertFalse(it.isVolatile)
it.isVolatile = true
assertTrue(it.isVolatile)
}
}
}
@Test
fun minimumTileUpdateIntervalTest() {
validateTestSetup()
invoke(mapboxMap) { uiController, mapboxMap ->
mapboxMap.style!!.getSource(ID_GRID_SOURCE)!!.let {
assertEquals(0, it.minimumTileUpdateInterval)
it.minimumTileUpdateInterval = 1000
assertEquals(1000, it.minimumTileUpdateInterval)
}
}
}
}

View File

@@ -0,0 +1,786 @@
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.Feature;
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.CircleLayer;
import com.mapbox.mapboxsdk.style.layers.FillLayer;
import com.mapbox.mapboxsdk.style.layers.Layer;
import com.mapbox.mapboxsdk.style.layers.SymbolLayer;
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
import com.mapbox.mapboxsdk.style.sources.Source;
import com.mapbox.mapboxsdk.style.types.Formatted;
import com.mapbox.mapboxsdk.style.types.FormattedSection;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.ResourceUtils;
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils;
import com.mapbox.mapboxsdk.utils.ColorUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.HashMap;
import timber.log.Timber;
import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatFontScale;
import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatTextColor;
import static com.mapbox.mapboxsdk.style.expressions.Expression.FormatOption.formatTextFont;
import static com.mapbox.mapboxsdk.style.expressions.Expression.NumberFormatOption.currency;
import static com.mapbox.mapboxsdk.style.expressions.Expression.NumberFormatOption.locale;
import static com.mapbox.mapboxsdk.style.expressions.Expression.NumberFormatOption.maxFractionDigits;
import static com.mapbox.mapboxsdk.style.expressions.Expression.NumberFormatOption.minFractionDigits;
import static com.mapbox.mapboxsdk.style.expressions.Expression.collator;
import static com.mapbox.mapboxsdk.style.expressions.Expression.color;
import static com.mapbox.mapboxsdk.style.expressions.Expression.eq;
import static com.mapbox.mapboxsdk.style.expressions.Expression.exponential;
import static com.mapbox.mapboxsdk.style.expressions.Expression.format;
import static com.mapbox.mapboxsdk.style.expressions.Expression.formatEntry;
import static com.mapbox.mapboxsdk.style.expressions.Expression.get;
import static com.mapbox.mapboxsdk.style.expressions.Expression.interpolate;
import static com.mapbox.mapboxsdk.style.expressions.Expression.literal;
import static com.mapbox.mapboxsdk.style.expressions.Expression.match;
import static com.mapbox.mapboxsdk.style.expressions.Expression.number;
import static com.mapbox.mapboxsdk.style.expressions.Expression.numberFormat;
import static com.mapbox.mapboxsdk.style.expressions.Expression.rgb;
import static com.mapbox.mapboxsdk.style.expressions.Expression.rgba;
import static com.mapbox.mapboxsdk.style.expressions.Expression.step;
import static com.mapbox.mapboxsdk.style.expressions.Expression.stop;
import static com.mapbox.mapboxsdk.style.expressions.Expression.string;
import static com.mapbox.mapboxsdk.style.expressions.Expression.switchCase;
import static com.mapbox.mapboxsdk.style.expressions.Expression.toColor;
import static com.mapbox.mapboxsdk.style.expressions.Expression.zoom;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.circleColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillAntialias;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillOutlineColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.textField;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@RunWith(AndroidJUnit4.class)
public class ExpressionTest extends EspressoTest {
private FillLayer layer;
@Test
public void testConstantExpressionConversion() {
validateTestSetup();
setupStyle();
Timber.i("camera function");
invoke(mapboxMap, (uiController, mapboxMap) -> {
// create color expression
Expression inputExpression = rgba(255.0f, 0.0f, 0.0f, 1.0f);
// set color expression
layer.setProperties(
fillColor(inputExpression)
);
// get color value
int color = layer.getFillColor().getColorInt();
// compare
assertEquals("input expression should match", Color.RED, color);
});
}
@Test
public void testGetExpressionWrapping() {
validateTestSetup();
setupStyle();
Timber.i("camera function");
invoke(mapboxMap, (uiController, mapboxMap) -> {
// create get expression
Expression inputExpression = get("fill");
// set get expression
layer.setProperties(
fillColor(inputExpression)
);
// get actual expression
Expression actualExpression = layer.getFillColor().getExpression();
// create wrapped expected expression
Expression expectedExpression = toColor(get("fill"));
// compare
assertEquals("input expression should match", expectedExpression, actualExpression);
});
}
@Test
public void testCameraFunction() {
validateTestSetup();
setupStyle();
Timber.i("camera function");
invoke(mapboxMap, (uiController, mapboxMap) -> {
// create camera function expression
Expression inputExpression = interpolate(
exponential(0.5f), zoom(),
stop(1.0f, rgba(255.0f, 0.0f, 0.0f, 1.0f)),
stop(5.0f, rgba(0.0f, 0.0f, 255.0f, 1.0f)),
stop(10.0f, rgba(0.0f, 255.0f, 0.0f, 1.0f))
);
// set camera function expression
layer.setProperties(
fillColor(inputExpression)
);
// get camera function expression
Expression outputExpression = layer.getFillColor().getExpression();
// compare
assertEquals("input expression should match", inputExpression, outputExpression);
});
}
@Test
public void testSourceFunction() {
validateTestSetup();
setupStyle();
Timber.i("camera function");
invoke(mapboxMap, (uiController, mapboxMap) -> {
// create camera function expression
Expression inputExpression = toColor(get("fill"));
// set camera function expression
layer.setProperties(
fillColor(inputExpression)
);
// get camera function expression
Expression outputExpression = layer.getFillColor().getExpression();
// compare
assertEquals("input expression should match", inputExpression, outputExpression);
});
}
@Test
public void testCompositeFunction() {
validateTestSetup();
setupStyle();
Timber.i("camera function");
invoke(mapboxMap, (uiController, mapboxMap) -> {
// create camera function expression
Expression inputExpression = step(zoom(),
rgba(255.0f, 255.0f, 255.0f, 1.0f),
stop(7.0f, match(
string(get("name")),
literal("Westerpark"), rgba(255.0f, 0.0f, 0.0f, 1.0f),
rgba(255.0f, 255.0f, 255.0f, 1.0f)
)),
stop(8.0f, match(
string(get("name")),
literal("Westerpark"), rgba(0.0f, 0.0f, 255.0f, 1.0f),
rgba(255.0f, 255.0f, 255.0f, 1.0f)
))
);
// set camera function expression
layer.setProperties(
fillColor(inputExpression)
);
// get camera function expression
Expression outputExpression = layer.getFillColor().getExpression();
// compare
assertEquals("input expression should match", inputExpression, outputExpression);
});
}
@Test
public void testLiteralProperty() {
validateTestSetup();
setupStyle();
invoke(mapboxMap, (uiController, mapboxMap) -> {
layer.setProperties(
fillColor(literal("#4286f4"))
);
});
}
@Test
public void testLiteralMatchExpression() {
validateTestSetup();
setupStyle();
invoke(mapboxMap, (uiController, mapboxMap) -> {
Expression expression = match(literal("something"), literal(0f),
stop("1", get("1")),
stop("2", get("2")),
stop("3", get("3")),
stop("4", get("4"))
);
layer.setProperties(
fillColor(expression)
);
expression.toArray();
});
}
@Test
public void testCollatorExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
Expression expression1 = eq(literal("Łukasz"), literal("lukasz"), collator(true, true));
Expression expression2 = eq(literal("Łukasz"), literal("lukasz"), collator(literal(false), eq(literal(1),
literal(1)), literal("en")));
Expression expression3 = eq(literal("Łukasz"), literal("lukasz"), collator(literal(false), eq(literal(2),
literal(1))));
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
Layer layer = new CircleLayer("layer", "source")
.withProperties(circleColor(
switchCase(
expression1, literal(ColorUtils.colorToRgbaString(Color.GREEN)),
literal(ColorUtils.colorToRgbaString(Color.RED))
)
));
mapboxMap.getStyle().addLayer(layer);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
layer.setProperties(circleColor(
switchCase(
expression2, literal(ColorUtils.colorToRgbaString(Color.GREEN)),
literal(ColorUtils.colorToRgbaString(Color.RED))
)
));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
layer.setProperties(circleColor(
switchCase(
expression3, literal(ColorUtils.colorToRgbaString(Color.GREEN)),
literal(ColorUtils.colorToRgbaString(Color.RED))
)
));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
});
}
@Test
public void testConstFormatExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry("test")
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(new FormattedSection("test")), layer.getTextField().getValue());
});
}
@Test
public void testConstFormatExpressionFontScaleParam() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry("test", formatFontScale(1.75))
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(new FormattedSection("test", 1.75)), layer.getTextField().getValue());
});
}
@Test
public void testConstFormatExpressionTextFontParam() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
literal("test"),
formatTextFont(new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"})
)
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(
mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(
new FormattedSection("test",
new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"})
), layer.getTextField().getValue());
});
}
@Test
public void testConstFormatExpressionTextColorParam() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
literal("test"),
formatTextColor(literal("yellow"))
)
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(
mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(
new FormattedSection("test", null, null, "rgba(255,255,0,1)")
), layer.getTextField().getValue());
});
}
@Test
public void testConstFormatExpressionAllParams() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
"test",
formatFontScale(0.5),
formatTextFont(new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"}),
formatTextColor(rgb(126, 0, 0))
)
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(
mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(
new FormattedSection("test",
0.5,
new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"},
"rgba(126,0,0,1)")
), layer.getTextField().getValue());
});
}
@Test
public void testConstFormatExpressionMultipleInputs() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
"test",
formatFontScale(1.5),
formatTextFont(new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"})
),
formatEntry("\ntest2", formatFontScale(2), formatTextColor(Color.BLUE)),
formatEntry("\ntest3", formatFontScale(2.5), formatTextColor(toColor(literal("rgba(0, 128, 255, 0.5)"))))
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(
mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(
new FormattedSection("test", 1.5,
new String[] {"DIN Offc Pro Regular", "Arial Unicode MS Regular"}),
new FormattedSection("\ntest2", 2.0, null, "rgba(0,0,255,1)"),
new FormattedSection("\ntest3", 2.5, null, "rgba(0,128,255,0.5)")
), layer.getTextField().getValue());
});
}
@Test
public void testVariableFormatExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
Feature feature = Feature.fromGeometry(Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()));
feature.addStringProperty("test_property", "test");
feature.addNumberProperty("test_property_number", 1.5);
feature.addStringProperty("test_property_color", "green");
mapboxMap.getStyle().addSource(new GeoJsonSource("source", feature));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
get("test_property"),
Expression.FormatOption.formatFontScale(number(get("test_property_number"))),
formatTextFont(new String[] {"Arial Unicode MS Regular", "DIN Offc Pro Regular"}),
formatTextColor(toColor(get("test_property_color")))
)
);
layer.setProperties(textField(expression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertEquals(expression, layer.getTextField().getExpression());
assertNull(layer.getTextField().getValue());
});
}
@Test
public void testVariableFormatExpressionMultipleInputs() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
Feature feature = Feature.fromGeometry(Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()));
feature.addStringProperty("test_property", "test");
feature.addNumberProperty("test_property_number", 1.5);
feature.addStringProperty("test_property_color", "rgba(0, 255, 0, 1)");
mapboxMap.getStyle().addSource(new GeoJsonSource("source", feature));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression expression = format(
formatEntry(
get("test_property"),
formatFontScale(1.25),
formatTextFont(new String[] {"Arial Unicode MS Regular", "DIN Offc Pro Regular"}),
formatTextColor(toColor(get("test_property_color")))
),
formatEntry("\ntest2", formatFontScale(2))
);
layer.setProperties(textField(expression), textColor("rgba(128, 0, 0, 1)"));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertEquals(expression, layer.getTextField().getExpression());
assertNull(layer.getTextField().getValue());
});
}
@Test
public void testFormatExpressionPlainTextCoercion() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
layer.setProperties(textField("test"));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertNull(layer.getTextField().getExpression());
assertEquals(new Formatted(
new FormattedSection("test")), layer.getTextField().getValue());
});
}
@Test
public void testTextFieldFormattedArgument() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Formatted formatted = new Formatted(
new FormattedSection("test", 1.5),
new FormattedSection("\ntest", 0.5, new String[] {"Arial Unicode MS Regular", "DIN Offc Pro Regular"}),
new FormattedSection("test", null, null, "rgba(0,255,0,1)")
);
layer.setProperties(textField(formatted), textColor("rgba(128,0,0,1)"));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(mapboxMap.getProjection().toScreenLocation(latLng), "layer")
.isEmpty());
assertNull(layer.getTextField().getExpression());
assertEquals(formatted, layer.getTextField().getValue());
});
}
@Test
public void testNumberFormatCurrencyExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
layer.setProperties(
textField(
numberFormat(12.345, locale("en-US"), currency("USD"))
)
);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals("$12.35", layer.getTextField().getValue().getFormattedSections()[0].getText());
});
}
@Test
public void testNumberFormatMaxExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
layer.setProperties(
textField(
numberFormat(12.34567890, maxFractionDigits(5), minFractionDigits(0))
)
);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals("12.34568", layer.getTextField().getValue().getFormattedSections()[0].getText());
});
}
@Test
public void testNumberFormatMinExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
layer.setProperties(
textField(
numberFormat(12.0000001, maxFractionDigits(5), minFractionDigits(0))
)
);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals("12", layer.getTextField().getValue().getFormattedSections()[0].getText());
});
}
@Test
public void testNumberFormatLocaleExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle()
.addSource(new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude())));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
layer.setProperties(
textField(
numberFormat(12.0000001, locale("nl-BE"), maxFractionDigits(5), minFractionDigits(1))
)
);
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNull(layer.getTextField().getExpression());
assertEquals("12,0", layer.getTextField().getValue().getFormattedSections()[0].getText());
});
}
@Test
public void testNumberFormatNonConstantExpression() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
Feature feature = Feature.fromGeometry(Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()));
feature.addNumberProperty("number_value", 12.345678);
feature.addStringProperty("locale_value", "nl-BE");
feature.addNumberProperty("max_value", 5);
feature.addNumberProperty("min_value", 1);
mapboxMap.getStyle().addSource(new GeoJsonSource("source", feature));
SymbolLayer layer = new SymbolLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression numberFormatExpression = numberFormat(
number(number(get("number_value"))),
locale(string(get("locale_value"))),
maxFractionDigits(number(get("max_value"))),
minFractionDigits(number(get("min_value")))
);
layer.setProperties(textField(numberFormatExpression));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertFalse(mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(latLng), "layer").isEmpty()
);
assertNotNull(layer.getTextField().getExpression());
// Expressions evaluated to string are wrapped by a format expression, take array index 1 to get original
Object[] returnExpression = (Object[]) layer.getTextField().getExpression().toArray()[1];
Object[] setExpression = numberFormatExpression.toArray();
assertEquals("Number format should match",returnExpression[0], setExpression[0]);
assertArrayEquals("Get value expression should match",
(Object[]) returnExpression[1],
(Object[]) setExpression[1]
);
// number format objects
HashMap<String, Object> returnMap = (HashMap<String, Object>) returnExpression[2];
HashMap<String, Object> setMap = (HashMap<String, Object>) returnExpression[2];
assertArrayEquals("Number format min fraction digits should match ",
(Object[]) returnMap.get("min-fraction-digits"),
(Object[]) setMap.get("min-fraction-digits")
);
assertArrayEquals("Number format max fraction digits should match ",
(Object[]) returnMap.get("max-fraction-digits"),
(Object[]) setMap.get("max-fraction-digits")
);
assertArrayEquals("Number format min fraction digits should match ",
(Object[]) returnMap.get("locale"),
(Object[]) setMap.get("locale")
);
});
}
/**
* Regression test for #15532
*/
@Test
public void testDoubleConversion() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
LatLng latLng = new LatLng(51, 17);
mapboxMap.getStyle().addSource(
new GeoJsonSource("source", Point.fromLngLat(latLng.getLongitude(), latLng.getLatitude()))
);
CircleLayer layer = new CircleLayer("layer", "source");
mapboxMap.getStyle().addLayer(layer);
Expression input = interpolate(
exponential(0.5f), zoom(),
stop(-0.1, color(Color.RED)),
stop(0, color(Color.BLUE))
);
layer.setProperties(circleColor(input));
Expression output = layer.getCircleColor().getExpression();
assertArrayEquals("Expression should match", input.toArray(), output.toArray());
});
}
private void setupStyle() {
invoke(mapboxMap, (uiController, mapboxMap) -> {
// Add a source
Source source;
try {
source = new GeoJsonSource("amsterdam-parks-source",
ResourceUtils.readRawResource(rule.getActivity(), R.raw.amsterdam));
mapboxMap.getStyle().addSource(source);
} catch (IOException ioException) {
return;
}
// Add a fill layer
mapboxMap.getStyle().addLayer(layer = new FillLayer("amsterdam-parks-layer", source.getId())
.withProperties(
fillColor(rgba(0.0f, 0.0f, 0.0f, 0.5f)),
fillOutlineColor(rgb(0, 0, 255)),
fillAntialias(true)
)
);
});
}
}

View File

@@ -0,0 +1,416 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.FillExtrusionLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for FillExtrusionLayer
*/
@RunWith(AndroidJUnit4.class)
public class FillExtrusionLayerTest extends BaseLayerTest {
private FillExtrusionLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new FillExtrusionLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFillExtrusionOpacityTransition() {
Timber.i("fill-extrusion-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionOpacityTransition(options);
assertEquals(layer.getFillExtrusionOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionOpacityAsConstant() {
Timber.i("fill-extrusion-opacity");
assertNotNull(layer);
assertNull(layer.getFillExtrusionOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(fillExtrusionOpacity(propertyValue));
assertEquals(layer.getFillExtrusionOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionColorTransition() {
Timber.i("fill-extrusion-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionColorTransition(options);
assertEquals(layer.getFillExtrusionColorTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionColorAsConstant() {
Timber.i("fill-extrusion-color");
assertNotNull(layer);
assertNull(layer.getFillExtrusionColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(fillExtrusionColor(propertyValue));
assertEquals(layer.getFillExtrusionColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionColorAsExpression() {
Timber.i("fill-extrusion-color-expression");
assertNotNull(layer);
assertNull(layer.getFillExtrusionColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(fillExtrusionColor(expression));
assertEquals(layer.getFillExtrusionColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillExtrusionColorAsIntConstant() {
Timber.i("fill-extrusion-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(fillExtrusionColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getFillExtrusionColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testFillExtrusionTranslateTransition() {
Timber.i("fill-extrusion-translateTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionTranslateTransition(options);
assertEquals(layer.getFillExtrusionTranslateTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionTranslateAsConstant() {
Timber.i("fill-extrusion-translate");
assertNotNull(layer);
assertNull(layer.getFillExtrusionTranslate().getValue());
// Set and Get
Float[] propertyValue = new Float[] {0f, 0f};
layer.setProperties(fillExtrusionTranslate(propertyValue));
assertEquals(layer.getFillExtrusionTranslate().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionTranslateAnchorAsConstant() {
Timber.i("fill-extrusion-translate-anchor");
assertNotNull(layer);
assertNull(layer.getFillExtrusionTranslateAnchor().getValue());
// Set and Get
String propertyValue = FILL_EXTRUSION_TRANSLATE_ANCHOR_MAP;
layer.setProperties(fillExtrusionTranslateAnchor(propertyValue));
assertEquals(layer.getFillExtrusionTranslateAnchor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionPatternTransition() {
Timber.i("fill-extrusion-patternTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionPatternTransition(options);
assertEquals(layer.getFillExtrusionPatternTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionPatternAsConstant() {
Timber.i("fill-extrusion-pattern");
assertNotNull(layer);
assertNull(layer.getFillExtrusionPattern().getValue());
// Set and Get
String propertyValue = "pedestrian-polygon";
layer.setProperties(fillExtrusionPattern(propertyValue));
assertEquals(layer.getFillExtrusionPattern().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionPatternAsExpression() {
Timber.i("fill-extrusion-pattern-expression");
assertNotNull(layer);
assertNull(layer.getFillExtrusionPattern().getExpression());
// Set and Get
Expression expression = image(string(Expression.get("undefined")));
layer.setProperties(fillExtrusionPattern(expression));
assertEquals(layer.getFillExtrusionPattern().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillExtrusionHeightTransition() {
Timber.i("fill-extrusion-heightTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionHeightTransition(options);
assertEquals(layer.getFillExtrusionHeightTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionHeightAsConstant() {
Timber.i("fill-extrusion-height");
assertNotNull(layer);
assertNull(layer.getFillExtrusionHeight().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(fillExtrusionHeight(propertyValue));
assertEquals(layer.getFillExtrusionHeight().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionHeightAsExpression() {
Timber.i("fill-extrusion-height-expression");
assertNotNull(layer);
assertNull(layer.getFillExtrusionHeight().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(fillExtrusionHeight(expression));
assertEquals(layer.getFillExtrusionHeight().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillExtrusionBaseTransition() {
Timber.i("fill-extrusion-baseTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillExtrusionBaseTransition(options);
assertEquals(layer.getFillExtrusionBaseTransition(), options);
}
@Test
@UiThreadTest
public void testFillExtrusionBaseAsConstant() {
Timber.i("fill-extrusion-base");
assertNotNull(layer);
assertNull(layer.getFillExtrusionBase().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(fillExtrusionBase(propertyValue));
assertEquals(layer.getFillExtrusionBase().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillExtrusionBaseAsExpression() {
Timber.i("fill-extrusion-base-expression");
assertNotNull(layer);
assertNull(layer.getFillExtrusionBase().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(fillExtrusionBase(expression));
assertEquals(layer.getFillExtrusionBase().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillExtrusionVerticalGradientAsConstant() {
Timber.i("fill-extrusion-vertical-gradient");
assertNotNull(layer);
assertNull(layer.getFillExtrusionVerticalGradient().getValue());
// Set and Get
Boolean propertyValue = true;
layer.setProperties(fillExtrusionVerticalGradient(propertyValue));
assertEquals(layer.getFillExtrusionVerticalGradient().getValue(), propertyValue);
}
}

View File

@@ -0,0 +1,428 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.FillLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for FillLayer
*/
@RunWith(AndroidJUnit4.class)
public class FillLayerTest extends BaseLayerTest {
private FillLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new FillLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFillSortKeyAsConstant() {
Timber.i("fill-sort-key");
assertNotNull(layer);
assertNull(layer.getFillSortKey().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(fillSortKey(propertyValue));
assertEquals(layer.getFillSortKey().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillSortKeyAsExpression() {
Timber.i("fill-sort-key-expression");
assertNotNull(layer);
assertNull(layer.getFillSortKey().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(fillSortKey(expression));
assertEquals(layer.getFillSortKey().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillAntialiasAsConstant() {
Timber.i("fill-antialias");
assertNotNull(layer);
assertNull(layer.getFillAntialias().getValue());
// Set and Get
Boolean propertyValue = true;
layer.setProperties(fillAntialias(propertyValue));
assertEquals(layer.getFillAntialias().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillOpacityTransition() {
Timber.i("fill-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillOpacityTransition(options);
assertEquals(layer.getFillOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testFillOpacityAsConstant() {
Timber.i("fill-opacity");
assertNotNull(layer);
assertNull(layer.getFillOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(fillOpacity(propertyValue));
assertEquals(layer.getFillOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillOpacityAsExpression() {
Timber.i("fill-opacity-expression");
assertNotNull(layer);
assertNull(layer.getFillOpacity().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(fillOpacity(expression));
assertEquals(layer.getFillOpacity().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillColorTransition() {
Timber.i("fill-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillColorTransition(options);
assertEquals(layer.getFillColorTransition(), options);
}
@Test
@UiThreadTest
public void testFillColorAsConstant() {
Timber.i("fill-color");
assertNotNull(layer);
assertNull(layer.getFillColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(fillColor(propertyValue));
assertEquals(layer.getFillColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillColorAsExpression() {
Timber.i("fill-color-expression");
assertNotNull(layer);
assertNull(layer.getFillColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(fillColor(expression));
assertEquals(layer.getFillColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillColorAsIntConstant() {
Timber.i("fill-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(fillColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getFillColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testFillOutlineColorTransition() {
Timber.i("fill-outline-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillOutlineColorTransition(options);
assertEquals(layer.getFillOutlineColorTransition(), options);
}
@Test
@UiThreadTest
public void testFillOutlineColorAsConstant() {
Timber.i("fill-outline-color");
assertNotNull(layer);
assertNull(layer.getFillOutlineColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(fillOutlineColor(propertyValue));
assertEquals(layer.getFillOutlineColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillOutlineColorAsExpression() {
Timber.i("fill-outline-color-expression");
assertNotNull(layer);
assertNull(layer.getFillOutlineColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(fillOutlineColor(expression));
assertEquals(layer.getFillOutlineColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testFillOutlineColorAsIntConstant() {
Timber.i("fill-outline-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(fillOutlineColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getFillOutlineColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testFillTranslateTransition() {
Timber.i("fill-translateTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillTranslateTransition(options);
assertEquals(layer.getFillTranslateTransition(), options);
}
@Test
@UiThreadTest
public void testFillTranslateAsConstant() {
Timber.i("fill-translate");
assertNotNull(layer);
assertNull(layer.getFillTranslate().getValue());
// Set and Get
Float[] propertyValue = new Float[] {0f, 0f};
layer.setProperties(fillTranslate(propertyValue));
assertEquals(layer.getFillTranslate().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillTranslateAnchorAsConstant() {
Timber.i("fill-translate-anchor");
assertNotNull(layer);
assertNull(layer.getFillTranslateAnchor().getValue());
// Set and Get
String propertyValue = FILL_TRANSLATE_ANCHOR_MAP;
layer.setProperties(fillTranslateAnchor(propertyValue));
assertEquals(layer.getFillTranslateAnchor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillPatternTransition() {
Timber.i("fill-patternTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setFillPatternTransition(options);
assertEquals(layer.getFillPatternTransition(), options);
}
@Test
@UiThreadTest
public void testFillPatternAsConstant() {
Timber.i("fill-pattern");
assertNotNull(layer);
assertNull(layer.getFillPattern().getValue());
// Set and Get
String propertyValue = "pedestrian-polygon";
layer.setProperties(fillPattern(propertyValue));
assertEquals(layer.getFillPattern().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testFillPatternAsExpression() {
Timber.i("fill-pattern-expression");
assertNotNull(layer);
assertNull(layer.getFillPattern().getExpression());
// Set and Get
Expression expression = image(string(Expression.get("undefined")));
layer.setProperties(fillPattern(expression));
assertEquals(layer.getFillPattern().getExpression(), expression);
}
}

View File

@@ -0,0 +1,189 @@
package com.mapbox.mapboxsdk.testapp.style;
import androidx.annotation.RawRes;
import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.view.View;
import com.mapbox.geojson.Feature;
import com.mapbox.geojson.FeatureCollection;
import com.mapbox.geojson.Point;
import com.mapbox.mapboxsdk.geometry.LatLng;
import com.mapbox.mapboxsdk.style.layers.CircleLayer;
import com.mapbox.mapboxsdk.style.layers.Layer;
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.ResourceUtils;
import com.mapbox.mapboxsdk.testapp.utils.TestingAsyncUtils;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import timber.log.Timber;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static org.junit.Assert.assertEquals;
/**
* Tests for {@link GeoJsonSource}
*/
@RunWith(AndroidJUnit4.class)
public class GeoJsonSourceTests extends EspressoTest {
@Test
public void testFeatureCollection() {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = null;
try {
source = new GeoJsonSource("source", FeatureCollection
.fromJson(ResourceUtils.readRawResource(rule.getActivity(), R.raw.test_feature_collection)));
} catch (IOException exception) {
Timber.e(exception);
}
mapboxMap.getStyle().addSource(source);
mapboxMap.getStyle().addLayer(new CircleLayer("layer", source.getId()));
});
}
@Test
public void testPointGeometry() {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = new GeoJsonSource("source", Point.fromLngLat(0d, 0d));
mapboxMap.getStyle().addSource(source);
mapboxMap.getStyle().addLayer(new CircleLayer("layer", source.getId()));
});
}
@Test
public void testFeatureProperties() {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = null;
try {
source = new GeoJsonSource("source",
ResourceUtils.readRawResource(rule.getActivity(), R.raw.test_feature_properties));
} catch (IOException exception) {
Timber.e(exception);
}
mapboxMap.getStyle().addSource(source);
mapboxMap.getStyle().addLayer(new CircleLayer("layer", source.getId()));
});
}
@Test
public void testUpdateCoalescing() {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = new GeoJsonSource("source");
mapboxMap.getStyle().addSource(source);
mapboxMap.getStyle().addLayer(new CircleLayer("layer", source.getId()));
source.setGeoJson(Point.fromLngLat(0, 0));
source.setGeoJson(Point.fromLngLat(-25, -25));
try {
source.setGeoJson(ResourceUtils.readRawResource(rule.getActivity(), R.raw.test_feature_properties));
} catch (IOException exception) {
Timber.e(exception);
}
source.setGeoJson(Point.fromLngLat(20, 55));
TestingAsyncUtils.INSTANCE.waitForLayer(uiController, mapView);
assertEquals(1, mapboxMap.queryRenderedFeatures(
mapboxMap.getProjection().toScreenLocation(
new LatLng(55, 20)), "layer").size());
});
}
@Test
public void testClearCollectionDuringConversion() {
// https://github.com/mapbox/mapbox-gl-native/issues/14565
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
for (int j = 0; j < 1000; j++) {
List<Feature> features = new ArrayList<>();
for (int i = 0; i < 100; i++) {
features.add(Feature.fromGeometry(Point.fromLngLat(0, 0)));
}
mapboxMap.getStyle().addSource(new GeoJsonSource("source" + j, FeatureCollection.fromFeatures(features)));
features.clear();
}
});
}
@Test
public void testPointFeature() {
testFeatureFromResource(R.raw.test_point_feature);
}
@Test
public void testLineStringFeature() {
testFeatureFromResource(R.raw.test_line_string_feature);
}
@Test
public void testPolygonFeature() {
testFeatureFromResource(R.raw.test_polygon_feature);
}
@Test
public void testPolygonWithHoleFeature() {
testFeatureFromResource(R.raw.test_polygon_with_hole_feature);
}
@Test
public void testMultiPointFeature() {
testFeatureFromResource(R.raw.test_multi_point_feature);
}
@Test
public void testMultiLineStringFeature() {
testFeatureFromResource(R.raw.test_multi_line_string_feature);
}
@Test
public void testMultiPolygonFeature() {
testFeatureFromResource(R.raw.test_multi_polygon_feature);
}
protected void testFeatureFromResource(final @RawRes int resource) {
validateTestSetup();
MapboxMapAction.invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = new GeoJsonSource("source");
mapboxMap.getStyle().addSource(source);
Layer layer = new CircleLayer("layer", source.getId());
mapboxMap.getStyle().addLayer(layer);
try {
source.setGeoJson(Feature.fromJson(ResourceUtils.readRawResource(rule.getActivity(), resource)));
} catch (IOException exception) {
Timber.e(exception);
}
mapboxMap.getStyle().removeLayer(layer);
mapboxMap.getStyle().removeSource(source);
});
}
public abstract class BaseViewAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
}
}

View File

@@ -0,0 +1,291 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.HeatmapLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for HeatmapLayer
*/
@RunWith(AndroidJUnit4.class)
public class HeatmapLayerTest extends BaseLayerTest {
private HeatmapLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new HeatmapLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testHeatmapRadiusTransition() {
Timber.i("heatmap-radiusTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHeatmapRadiusTransition(options);
assertEquals(layer.getHeatmapRadiusTransition(), options);
}
@Test
@UiThreadTest
public void testHeatmapRadiusAsConstant() {
Timber.i("heatmap-radius");
assertNotNull(layer);
assertNull(layer.getHeatmapRadius().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(heatmapRadius(propertyValue));
assertEquals(layer.getHeatmapRadius().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHeatmapRadiusAsExpression() {
Timber.i("heatmap-radius-expression");
assertNotNull(layer);
assertNull(layer.getHeatmapRadius().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(heatmapRadius(expression));
assertEquals(layer.getHeatmapRadius().getExpression(), expression);
}
@Test
@UiThreadTest
public void testHeatmapWeightAsConstant() {
Timber.i("heatmap-weight");
assertNotNull(layer);
assertNull(layer.getHeatmapWeight().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(heatmapWeight(propertyValue));
assertEquals(layer.getHeatmapWeight().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHeatmapWeightAsExpression() {
Timber.i("heatmap-weight-expression");
assertNotNull(layer);
assertNull(layer.getHeatmapWeight().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(heatmapWeight(expression));
assertEquals(layer.getHeatmapWeight().getExpression(), expression);
}
@Test
@UiThreadTest
public void testHeatmapIntensityTransition() {
Timber.i("heatmap-intensityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHeatmapIntensityTransition(options);
assertEquals(layer.getHeatmapIntensityTransition(), options);
}
@Test
@UiThreadTest
public void testHeatmapIntensityAsConstant() {
Timber.i("heatmap-intensity");
assertNotNull(layer);
assertNull(layer.getHeatmapIntensity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(heatmapIntensity(propertyValue));
assertEquals(layer.getHeatmapIntensity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHeatmapOpacityTransition() {
Timber.i("heatmap-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHeatmapOpacityTransition(options);
assertEquals(layer.getHeatmapOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testHeatmapOpacityAsConstant() {
Timber.i("heatmap-opacity");
assertNotNull(layer);
assertNull(layer.getHeatmapOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(heatmapOpacity(propertyValue));
assertEquals(layer.getHeatmapOpacity().getValue(), propertyValue);
}
}

View File

@@ -0,0 +1,245 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.HillshadeLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for HillshadeLayer
*/
@RunWith(AndroidJUnit4.class)
public class HillshadeLayerTest extends BaseLayerTest {
private HillshadeLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new HillshadeLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testHillshadeIlluminationDirectionAsConstant() {
Timber.i("hillshade-illumination-direction");
assertNotNull(layer);
assertNull(layer.getHillshadeIlluminationDirection().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(hillshadeIlluminationDirection(propertyValue));
assertEquals(layer.getHillshadeIlluminationDirection().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeIlluminationAnchorAsConstant() {
Timber.i("hillshade-illumination-anchor");
assertNotNull(layer);
assertNull(layer.getHillshadeIlluminationAnchor().getValue());
// Set and Get
String propertyValue = HILLSHADE_ILLUMINATION_ANCHOR_MAP;
layer.setProperties(hillshadeIlluminationAnchor(propertyValue));
assertEquals(layer.getHillshadeIlluminationAnchor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeExaggerationTransition() {
Timber.i("hillshade-exaggerationTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHillshadeExaggerationTransition(options);
assertEquals(layer.getHillshadeExaggerationTransition(), options);
}
@Test
@UiThreadTest
public void testHillshadeExaggerationAsConstant() {
Timber.i("hillshade-exaggeration");
assertNotNull(layer);
assertNull(layer.getHillshadeExaggeration().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(hillshadeExaggeration(propertyValue));
assertEquals(layer.getHillshadeExaggeration().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeShadowColorTransition() {
Timber.i("hillshade-shadow-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHillshadeShadowColorTransition(options);
assertEquals(layer.getHillshadeShadowColorTransition(), options);
}
@Test
@UiThreadTest
public void testHillshadeShadowColorAsConstant() {
Timber.i("hillshade-shadow-color");
assertNotNull(layer);
assertNull(layer.getHillshadeShadowColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(hillshadeShadowColor(propertyValue));
assertEquals(layer.getHillshadeShadowColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeShadowColorAsIntConstant() {
Timber.i("hillshade-shadow-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(hillshadeShadowColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getHillshadeShadowColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testHillshadeHighlightColorTransition() {
Timber.i("hillshade-highlight-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHillshadeHighlightColorTransition(options);
assertEquals(layer.getHillshadeHighlightColorTransition(), options);
}
@Test
@UiThreadTest
public void testHillshadeHighlightColorAsConstant() {
Timber.i("hillshade-highlight-color");
assertNotNull(layer);
assertNull(layer.getHillshadeHighlightColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(hillshadeHighlightColor(propertyValue));
assertEquals(layer.getHillshadeHighlightColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeHighlightColorAsIntConstant() {
Timber.i("hillshade-highlight-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(hillshadeHighlightColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getHillshadeHighlightColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testHillshadeAccentColorTransition() {
Timber.i("hillshade-accent-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setHillshadeAccentColorTransition(options);
assertEquals(layer.getHillshadeAccentColorTransition(), options);
}
@Test
@UiThreadTest
public void testHillshadeAccentColorAsConstant() {
Timber.i("hillshade-accent-color");
assertNotNull(layer);
assertNull(layer.getHillshadeAccentColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(hillshadeAccentColor(propertyValue));
assertEquals(layer.getHillshadeAccentColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testHillshadeAccentColorAsIntConstant() {
Timber.i("hillshade-accent-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(hillshadeAccentColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getHillshadeAccentColorAsInt(), Color.argb(127, 255, 127, 0));
}
}

View File

@@ -0,0 +1,75 @@
package com.mapbox.mapboxsdk.testapp.style
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.mapbox.mapboxsdk.testapp.R
import com.mapbox.mapboxsdk.testapp.action.MapboxMapAction
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest
import java.util.*
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
/**
* CRUD tests around Image
*/
@RunWith(AndroidJUnit4::class)
class ImageTest : EspressoTest() {
companion object {
private const val IMAGE_ID = "test.image"
}
@Test
fun testAddGetImage() {
validateTestSetup()
MapboxMapAction.invoke(mapboxMap) { uiController, mapboxMap ->
val drawable = rule.activity.resources.getDrawable(R.drawable.ic_launcher_round)
assertTrue(drawable is BitmapDrawable)
val bitmapSet = (drawable as BitmapDrawable).bitmap
mapboxMap.style!!.addImage(IMAGE_ID, bitmapSet)
// adding an image requires converting the image with an asynctask
uiController.loopMainThreadForAtLeast(200)
val bitmapGet = mapboxMap.style!!.getImage(IMAGE_ID)
assertTrue(bitmapGet!!.similarTo(bitmapSet))
mapboxMap.style!!.removeImage(IMAGE_ID)
assertNull(mapboxMap.style!!.getImage(IMAGE_ID))
}
}
}
/**
* Alternative implementation of Bitmap.sameAs #14060
*/
fun Bitmap.similarTo(other: Bitmap): Boolean {
if (invalidConfig(other)) {
return false
}
// Allocate arrays
val argb = IntArray(width * height)
val argbOther = IntArray(other.width * other.height)
getPixels(argb, 0, width, 0, 0, width, height)
other.getPixels(argbOther, 0, width, 0, 0, width, height)
// Alpha channel special check
if (config == Bitmap.Config.ALPHA_8) {
// in this case we have to manually compare the alpha channel as the rest is garbage.
val length = width * height
for (i in 0 until length) {
if (argb[i] and -0x1000000 != argbOther[i] and -0x1000000) {
return false
}
}
return true
}
return Arrays.equals(argb, argbOther)
}
fun Bitmap.invalidConfig(other: Bitmap): Boolean = this.config != other.config || this.width != other.width || this.height != other.height

View File

@@ -0,0 +1,172 @@
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.view.View;
import com.mapbox.mapboxsdk.style.light.Light;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.FillExtrusionLayer;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import com.mapbox.mapboxsdk.style.light.Position;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.style.FillExtrusionStyleTestActivity;
import timber.log.Timber;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static com.mapbox.mapboxsdk.style.expressions.Expression.eq;
import static com.mapbox.mapboxsdk.style.layers.Property.ANCHOR_MAP;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionBase;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionHeight;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionOpacity;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
@RunWith(AndroidJUnit4.class)
public class LightTest extends BaseTest {
private Light light;
@Test
public void testAnchor() {
validateTestSetup();
setupLight();
Timber.i("anchor");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
light.setAnchor(ANCHOR_MAP);
assertEquals("Anchor should match", ANCHOR_MAP, light.getAnchor());
});
}
@Test
public void testPositionTransition() {
validateTestSetup();
setupLight();
Timber.i("positionTransitionOptions");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
light.setPositionTransition(options);
assertEquals("Transition options should match", options, light.getPositionTransition());
});
}
@Test
public void testPosition() {
validateTestSetup();
setupLight();
Timber.i("position");
invoke(mapboxMap,(uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
Position position = new Position(1, 2, 3);
light.setPosition(position);
assertEquals("Position should match", position, light.getPosition());
});
}
@Test
public void testColorTransition() {
validateTestSetup();
setupLight();
Timber.i("colorTransitionOptions");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
light.setColorTransition(options);
assertEquals("Transition options should match", options, light.getColorTransition());
});
}
@Test
public void testColor() {
validateTestSetup();
setupLight();
Timber.i("color");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
light.setColor("rgba(255,128,0,0.7)");
assertEquals("Color should match", "rgba(255,128,0,0.7)", light.getColor());
});
}
@Test
public void testIntensityTransition() {
validateTestSetup();
setupLight();
Timber.i("intensityTransitionOptions");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
light.setIntensityTransition(options);
assertEquals("Transition options should match", options, light.getIntensityTransition());
});
}
@Test
public void testIntensity() {
validateTestSetup();
setupLight();
Timber.i("intensity");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
light.setIntensity(0.3f);
assertEquals("Intensity should match", 0.3f, light.getIntensity());
});
}
private void setupLight() {
onView(withId(R.id.mapView)).perform(new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
light = mapboxMap.getStyle().getLight();
FillExtrusionLayer fillExtrusionLayer = new FillExtrusionLayer("3d-buildings", "composite");
fillExtrusionLayer.setSourceLayer("building");
fillExtrusionLayer.setFilter(eq(Expression.get("extrude"), "true"));
fillExtrusionLayer.setMinZoom(15);
fillExtrusionLayer.setProperties(
fillExtrusionColor(Color.LTGRAY),
fillExtrusionHeight(Expression.get("height")),
fillExtrusionBase(Expression.get("min_height")),
fillExtrusionOpacity(0.6f)
);
mapboxMap.getStyle().addLayer(fillExtrusionLayer);
}
});
}
@Override
protected Class getActivityClass() {
return FillExtrusionStyleTestActivity.class;
}
}

View File

@@ -0,0 +1,595 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.LineLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for LineLayer
*/
@RunWith(AndroidJUnit4.class)
public class LineLayerTest extends BaseLayerTest {
private LineLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new LineLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testLineCapAsConstant() {
Timber.i("line-cap");
assertNotNull(layer);
assertNull(layer.getLineCap().getValue());
// Set and Get
String propertyValue = LINE_CAP_BUTT;
layer.setProperties(lineCap(propertyValue));
assertEquals(layer.getLineCap().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineJoinAsConstant() {
Timber.i("line-join");
assertNotNull(layer);
assertNull(layer.getLineJoin().getValue());
// Set and Get
String propertyValue = LINE_JOIN_BEVEL;
layer.setProperties(lineJoin(propertyValue));
assertEquals(layer.getLineJoin().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineJoinAsExpression() {
Timber.i("line-join-expression");
assertNotNull(layer);
assertNull(layer.getLineJoin().getExpression());
// Set and Get
Expression expression = string(Expression.get("undefined"));
layer.setProperties(lineJoin(expression));
assertEquals(layer.getLineJoin().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineMiterLimitAsConstant() {
Timber.i("line-miter-limit");
assertNotNull(layer);
assertNull(layer.getLineMiterLimit().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineMiterLimit(propertyValue));
assertEquals(layer.getLineMiterLimit().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineRoundLimitAsConstant() {
Timber.i("line-round-limit");
assertNotNull(layer);
assertNull(layer.getLineRoundLimit().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineRoundLimit(propertyValue));
assertEquals(layer.getLineRoundLimit().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineSortKeyAsConstant() {
Timber.i("line-sort-key");
assertNotNull(layer);
assertNull(layer.getLineSortKey().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineSortKey(propertyValue));
assertEquals(layer.getLineSortKey().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineSortKeyAsExpression() {
Timber.i("line-sort-key-expression");
assertNotNull(layer);
assertNull(layer.getLineSortKey().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(lineSortKey(expression));
assertEquals(layer.getLineSortKey().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineOpacityTransition() {
Timber.i("line-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineOpacityTransition(options);
assertEquals(layer.getLineOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testLineOpacityAsConstant() {
Timber.i("line-opacity");
assertNotNull(layer);
assertNull(layer.getLineOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineOpacity(propertyValue));
assertEquals(layer.getLineOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineOpacityAsExpression() {
Timber.i("line-opacity-expression");
assertNotNull(layer);
assertNull(layer.getLineOpacity().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(lineOpacity(expression));
assertEquals(layer.getLineOpacity().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineColorTransition() {
Timber.i("line-colorTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineColorTransition(options);
assertEquals(layer.getLineColorTransition(), options);
}
@Test
@UiThreadTest
public void testLineColorAsConstant() {
Timber.i("line-color");
assertNotNull(layer);
assertNull(layer.getLineColor().getValue());
// Set and Get
String propertyValue = "rgba(255,128,0,0.7)";
layer.setProperties(lineColor(propertyValue));
assertEquals(layer.getLineColor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineColorAsExpression() {
Timber.i("line-color-expression");
assertNotNull(layer);
assertNull(layer.getLineColor().getExpression());
// Set and Get
Expression expression = toColor(Expression.get("undefined"));
layer.setProperties(lineColor(expression));
assertEquals(layer.getLineColor().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineColorAsIntConstant() {
Timber.i("line-color");
assertNotNull(layer);
// Set and Get
layer.setProperties(lineColor(Color.argb(127, 255, 127, 0)));
assertEquals(layer.getLineColorAsInt(), Color.argb(127, 255, 127, 0));
}
@Test
@UiThreadTest
public void testLineTranslateTransition() {
Timber.i("line-translateTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineTranslateTransition(options);
assertEquals(layer.getLineTranslateTransition(), options);
}
@Test
@UiThreadTest
public void testLineTranslateAsConstant() {
Timber.i("line-translate");
assertNotNull(layer);
assertNull(layer.getLineTranslate().getValue());
// Set and Get
Float[] propertyValue = new Float[] {0f, 0f};
layer.setProperties(lineTranslate(propertyValue));
assertEquals(layer.getLineTranslate().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineTranslateAnchorAsConstant() {
Timber.i("line-translate-anchor");
assertNotNull(layer);
assertNull(layer.getLineTranslateAnchor().getValue());
// Set and Get
String propertyValue = LINE_TRANSLATE_ANCHOR_MAP;
layer.setProperties(lineTranslateAnchor(propertyValue));
assertEquals(layer.getLineTranslateAnchor().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineWidthTransition() {
Timber.i("line-widthTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineWidthTransition(options);
assertEquals(layer.getLineWidthTransition(), options);
}
@Test
@UiThreadTest
public void testLineWidthAsConstant() {
Timber.i("line-width");
assertNotNull(layer);
assertNull(layer.getLineWidth().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineWidth(propertyValue));
assertEquals(layer.getLineWidth().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineWidthAsExpression() {
Timber.i("line-width-expression");
assertNotNull(layer);
assertNull(layer.getLineWidth().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(lineWidth(expression));
assertEquals(layer.getLineWidth().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineGapWidthTransition() {
Timber.i("line-gap-widthTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineGapWidthTransition(options);
assertEquals(layer.getLineGapWidthTransition(), options);
}
@Test
@UiThreadTest
public void testLineGapWidthAsConstant() {
Timber.i("line-gap-width");
assertNotNull(layer);
assertNull(layer.getLineGapWidth().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineGapWidth(propertyValue));
assertEquals(layer.getLineGapWidth().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineGapWidthAsExpression() {
Timber.i("line-gap-width-expression");
assertNotNull(layer);
assertNull(layer.getLineGapWidth().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(lineGapWidth(expression));
assertEquals(layer.getLineGapWidth().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineOffsetTransition() {
Timber.i("line-offsetTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineOffsetTransition(options);
assertEquals(layer.getLineOffsetTransition(), options);
}
@Test
@UiThreadTest
public void testLineOffsetAsConstant() {
Timber.i("line-offset");
assertNotNull(layer);
assertNull(layer.getLineOffset().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineOffset(propertyValue));
assertEquals(layer.getLineOffset().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineBlurTransition() {
Timber.i("line-blurTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineBlurTransition(options);
assertEquals(layer.getLineBlurTransition(), options);
}
@Test
@UiThreadTest
public void testLineBlurAsConstant() {
Timber.i("line-blur");
assertNotNull(layer);
assertNull(layer.getLineBlur().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(lineBlur(propertyValue));
assertEquals(layer.getLineBlur().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLineBlurAsExpression() {
Timber.i("line-blur-expression");
assertNotNull(layer);
assertNull(layer.getLineBlur().getExpression());
// Set and Get
Expression expression = number(Expression.get("undefined"));
layer.setProperties(lineBlur(expression));
assertEquals(layer.getLineBlur().getExpression(), expression);
}
@Test
@UiThreadTest
public void testLineDasharrayTransition() {
Timber.i("line-dasharrayTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLineDasharrayTransition(options);
assertEquals(layer.getLineDasharrayTransition(), options);
}
@Test
@UiThreadTest
public void testLineDasharrayAsConstant() {
Timber.i("line-dasharray");
assertNotNull(layer);
assertNull(layer.getLineDasharray().getValue());
// Set and Get
Float[] propertyValue = new Float[] {};
layer.setProperties(lineDasharray(propertyValue));
assertEquals(layer.getLineDasharray().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLinePatternTransition() {
Timber.i("line-patternTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setLinePatternTransition(options);
assertEquals(layer.getLinePatternTransition(), options);
}
@Test
@UiThreadTest
public void testLinePatternAsConstant() {
Timber.i("line-pattern");
assertNotNull(layer);
assertNull(layer.getLinePattern().getValue());
// Set and Get
String propertyValue = "pedestrian-polygon";
layer.setProperties(linePattern(propertyValue));
assertEquals(layer.getLinePattern().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testLinePatternAsExpression() {
Timber.i("line-pattern-expression");
assertNotNull(layer);
assertNull(layer.getLinePattern().getExpression());
// Set and Get
Expression expression = image(string(Expression.get("undefined")));
layer.setProperties(linePattern(expression));
assertEquals(layer.getLinePattern().getExpression(), expression);
}
}

View File

@@ -0,0 +1,262 @@
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.RasterLayer;
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for RasterLayer
*/
@RunWith(AndroidJUnit4.class)
public class RasterLayerTest extends BaseLayerTest {
private RasterLayer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
layer = new RasterLayer("my-layer", "composite");
layer.setSourceLayer("composite");
setupLayer(layer);
}
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
@Test
@UiThreadTest
public void testRasterOpacityTransition() {
Timber.i("raster-opacityTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterOpacityTransition(options);
assertEquals(layer.getRasterOpacityTransition(), options);
}
@Test
@UiThreadTest
public void testRasterOpacityAsConstant() {
Timber.i("raster-opacity");
assertNotNull(layer);
assertNull(layer.getRasterOpacity().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterOpacity(propertyValue));
assertEquals(layer.getRasterOpacity().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterHueRotateTransition() {
Timber.i("raster-hue-rotateTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterHueRotateTransition(options);
assertEquals(layer.getRasterHueRotateTransition(), options);
}
@Test
@UiThreadTest
public void testRasterHueRotateAsConstant() {
Timber.i("raster-hue-rotate");
assertNotNull(layer);
assertNull(layer.getRasterHueRotate().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterHueRotate(propertyValue));
assertEquals(layer.getRasterHueRotate().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterBrightnessMinTransition() {
Timber.i("raster-brightness-minTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterBrightnessMinTransition(options);
assertEquals(layer.getRasterBrightnessMinTransition(), options);
}
@Test
@UiThreadTest
public void testRasterBrightnessMinAsConstant() {
Timber.i("raster-brightness-min");
assertNotNull(layer);
assertNull(layer.getRasterBrightnessMin().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterBrightnessMin(propertyValue));
assertEquals(layer.getRasterBrightnessMin().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterBrightnessMaxTransition() {
Timber.i("raster-brightness-maxTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterBrightnessMaxTransition(options);
assertEquals(layer.getRasterBrightnessMaxTransition(), options);
}
@Test
@UiThreadTest
public void testRasterBrightnessMaxAsConstant() {
Timber.i("raster-brightness-max");
assertNotNull(layer);
assertNull(layer.getRasterBrightnessMax().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterBrightnessMax(propertyValue));
assertEquals(layer.getRasterBrightnessMax().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterSaturationTransition() {
Timber.i("raster-saturationTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterSaturationTransition(options);
assertEquals(layer.getRasterSaturationTransition(), options);
}
@Test
@UiThreadTest
public void testRasterSaturationAsConstant() {
Timber.i("raster-saturation");
assertNotNull(layer);
assertNull(layer.getRasterSaturation().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterSaturation(propertyValue));
assertEquals(layer.getRasterSaturation().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterContrastTransition() {
Timber.i("raster-contrastTransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.setRasterContrastTransition(options);
assertEquals(layer.getRasterContrastTransition(), options);
}
@Test
@UiThreadTest
public void testRasterContrastAsConstant() {
Timber.i("raster-contrast");
assertNotNull(layer);
assertNull(layer.getRasterContrast().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterContrast(propertyValue));
assertEquals(layer.getRasterContrast().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterResamplingAsConstant() {
Timber.i("raster-resampling");
assertNotNull(layer);
assertNull(layer.getRasterResampling().getValue());
// Set and Get
String propertyValue = RASTER_RESAMPLING_LINEAR;
layer.setProperties(rasterResampling(propertyValue));
assertEquals(layer.getRasterResampling().getValue(), propertyValue);
}
@Test
@UiThreadTest
public void testRasterFadeDurationAsConstant() {
Timber.i("raster-fade-duration");
assertNotNull(layer);
assertNull(layer.getRasterFadeDuration().getValue());
// Set and Get
Float propertyValue = 0.3f;
layer.setProperties(rasterFadeDuration(propertyValue));
assertEquals(layer.getRasterFadeDuration().getValue(), propertyValue);
}
}

View File

@@ -0,0 +1,370 @@
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import android.graphics.PointF;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.view.View;
import com.mapbox.mapboxsdk.style.layers.CannotAddLayerException;
import com.mapbox.mapboxsdk.style.layers.CircleLayer;
import com.mapbox.mapboxsdk.style.layers.FillLayer;
import com.mapbox.mapboxsdk.style.layers.Layer;
import com.mapbox.mapboxsdk.style.layers.LineLayer;
import com.mapbox.mapboxsdk.style.layers.Property;
import com.mapbox.mapboxsdk.style.layers.PropertyFactory;
import com.mapbox.mapboxsdk.style.sources.CannotAddSourceException;
import com.mapbox.mapboxsdk.style.sources.GeoJsonSource;
import com.mapbox.mapboxsdk.style.sources.RasterSource;
import com.mapbox.mapboxsdk.style.sources.Source;
import com.mapbox.mapboxsdk.style.sources.VectorSource;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import junit.framework.Assert;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import timber.log.Timber;
import java.util.List;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Basic smoke tests for Layer and Source
*/
@RunWith(AndroidJUnit4.class)
public class RuntimeStyleTests extends EspressoTest {
@Test
public void testListLayers() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
List<Layer> layers = mapboxMap.getStyle().getLayers();
assertNotNull(layers);
assertTrue(layers.size() > 0);
for (Layer layer : layers) {
assertNotNull(layer);
}
}
});
}
@Test
public void testGetAddRemoveLayer() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new AddRemoveLayerAction());
}
@Test
public void testAddLayerAbove() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
List<Layer> layers = mapboxMap.getStyle().getLayers();
Source source = mapboxMap.getStyle().getSources().get(0);
// Test inserting with invalid above-id
try {
mapboxMap.getStyle().addLayerAbove(
new CircleLayer("invalid-id-layer-test", source.getId()), "no-such-layer-here-man"
);
fail("Should have thrown exception");
} catch (CannotAddLayerException ex) {
// Yeah
assertNotNull(ex.getMessage());
}
// Insert as last
CircleLayer last = new CircleLayer("this is the last one", source.getId());
mapboxMap.getStyle().addLayerAbove(last, layers.get(layers.size() - 1).getId());
layers = mapboxMap.getStyle().getLayers();
assertEquals(last.getId(), layers.get(layers.size() - 1).getId());
// Insert
CircleLayer second = new CircleLayer("this is the second one", source.getId());
mapboxMap.getStyle().addLayerAbove(second, layers.get(0).getId());
layers = mapboxMap.getStyle().getLayers();
assertEquals(second.getId(), layers.get(1).getId());
}
});
}
@Test
public void testRemoveLayerAt() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
// Remove by index
Layer firstLayer = mapboxMap.getStyle().getLayers().get(0);
boolean removed = mapboxMap.getStyle().removeLayerAt(0);
assertTrue(removed);
assertNotNull(firstLayer);
// Test remove by index bounds checks
Timber.i("Remove layer at index > size");
assertFalse(mapboxMap.getStyle().removeLayerAt(Integer.MAX_VALUE));
}
});
}
public void testAddLayerAt() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
List<Layer> layers = mapboxMap.getStyle().getLayers();
Source source = mapboxMap.getStyle().getSources().get(0);
// Test inserting out of range
try {
mapboxMap.getStyle().addLayerAt(new CircleLayer("invalid-id-layer-test", source.getId()), layers.size());
fail("Should have thrown exception");
} catch (CannotAddLayerException ex) {
// Yeah
assertNotNull(ex.getMessage());
}
// Insert at current last position
CircleLayer last = new CircleLayer("this is the last one", source.getId());
mapboxMap.getStyle().addLayerAt(last, layers.size() - 1);
layers = mapboxMap.getStyle().getLayers();
assertEquals(last.getId(), layers.get(layers.size() - 2).getId());
// Insert at start
CircleLayer second = new CircleLayer("this is the first one", source.getId());
mapboxMap.getStyle().addLayerAt(second, 0);
layers = mapboxMap.getStyle().getLayers();
assertEquals(second.getId(), layers.get(0).getId());
}
});
}
@Test
public void testListSources() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
List<Source> sources = mapboxMap.getStyle().getSources();
assertNotNull(sources);
assertTrue(sources.size() > 0);
for (Source source : sources) {
assertNotNull(source);
}
}
});
}
@Test
public void testAddRemoveSource() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
mapboxMap.getStyle().addSource(new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2"));
mapboxMap.getStyle().removeSource("my-source");
// Add initial source
mapboxMap.getStyle().addSource(new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2"));
// Remove
boolean removeOk = mapboxMap.getStyle().removeSource("my-source");
assertTrue(removeOk);
assertNull(mapboxMap.getStyle().getLayer("my-source"));
// Add
Source source = new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2");
mapboxMap.getStyle().addSource(source);
// Remove, preserving the reference
mapboxMap.getStyle().removeSource(source);
// Re-add the reference...
mapboxMap.getStyle().addSource(source);
// Ensure it's there
Assert.assertNotNull(mapboxMap.getStyle().getSource(source.getId()));
// Test adding a duplicate source
try {
Source source2 = new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2");
mapboxMap.getStyle().addSource(source2);
fail("Should not have been allowed to add a source with a duplicate id");
} catch (CannotAddSourceException cannotAddSourceException) {
// OK
}
});
}
@Test
public void testVectorSourceUrlGetter() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
VectorSource source = new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2");
mapboxMap.getStyle().addSource(source);
assertEquals("mapbox://mapbox.mapbox-terrain-v2", source.getUri());
});
}
@Test
public void testRasterSourceUrlGetter() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
RasterSource source = new RasterSource("my-source", "mapbox://mapbox.mapbox-terrain-v2");
mapboxMap.getStyle().addSource(source);
assertEquals("mapbox://mapbox.mapbox-terrain-v2", source.getUri());
});
}
@Test
public void testGeoJsonSourceUrlGetter() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
GeoJsonSource source = new GeoJsonSource("my-source");
mapboxMap.getStyle().addSource(source);
assertNull(source.getUri());
source.setUri("http://mapbox.com/my-file.json");
assertEquals("http://mapbox.com/my-file.json", source.getUri());
});
}
@Test
public void testRemoveSourceInUse() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
mapboxMap.getStyle().addSource(new VectorSource("my-source", "mapbox://mapbox.mapbox-terrain-v2"));
mapboxMap.getStyle().addLayer(new LineLayer("my-layer", "my-source"));
mapboxMap.getStyle().removeSource("my-source");
assertNotNull(mapboxMap.getStyle().getSource("my-source"));
}
});
}
@Test
public void testRemoveNonExistingSource() {
invoke(mapboxMap, (uiController, mapboxMap) -> mapboxMap.getStyle().removeSource("source"));
}
@Test
public void testRemoveNonExistingLayer() {
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertFalse(mapboxMap.getStyle().removeLayer("layer"));
assertFalse(mapboxMap.getStyle().removeLayerAt(mapboxMap.getStyle().getLayers().size() + 1));
assertFalse(mapboxMap.getStyle().removeLayerAt(-1));
});
}
@Test
public void testRemoveExistingLayer() {
invoke(mapboxMap, (uiController, mapboxMap) -> {
Layer firstLayer = mapboxMap.getStyle().getLayers().get(0);
assertTrue(mapboxMap.getStyle().removeLayer(firstLayer));
firstLayer = mapboxMap.getStyle().getLayers().get(0);
assertTrue(mapboxMap.getStyle().removeLayer(firstLayer.getId()));
assertTrue(mapboxMap.getStyle().removeLayerAt(0));
});
}
/**
* https://github.com/mapbox/mapbox-gl-native/issues/7973
*/
@Test
public void testQueryRenderedFeaturesInputHandling() {
validateTestSetup();
onView(withId(R.id.mapView)).perform(new BaseViewAction() {
@Override
public void perform(UiController uiController, View view) {
String[] layerIds = new String[600];
for (int i = 0; i < layerIds.length; i++) {
layerIds[i] = "layer-" + i;
}
mapboxMap.queryRenderedFeatures(new PointF(100, 100), layerIds);
}
});
}
private class AddRemoveLayerAction extends BaseViewAction {
@Override
public void perform(UiController uiController, View view) {
// Get initial
assertNotNull(mapboxMap.getStyle().getLayer("building"));
// Remove
boolean removed = mapboxMap.getStyle().removeLayer("building");
assertTrue(removed);
assertNull(mapboxMap.getStyle().getLayer("building"));
// Add
FillLayer layer = new FillLayer("building", "composite");
layer.setSourceLayer("building");
mapboxMap.getStyle().addLayer(layer);
assertNotNull(mapboxMap.getStyle().getLayer("building"));
// Assure the reference still works
layer.setProperties(PropertyFactory.visibility(Property.VISIBLE));
// Remove, preserving the reference
mapboxMap.getStyle().removeLayer(layer);
// Property setters should still work
layer.setProperties(PropertyFactory.fillColor(Color.RED));
// Re-add the reference...
mapboxMap.getStyle().addLayer(layer);
// Ensure it's there
Assert.assertNotNull(mapboxMap.getStyle().getLayer(layer.getId()));
// Test adding a duplicate layer
try {
mapboxMap.getStyle().addLayer(new FillLayer("building", "composite"));
fail("Should not have been allowed to add a layer with a duplicate id");
} catch (CannotAddLayerException cannotAddLayerException) {
// OK
}
}
}
public abstract class BaseViewAction implements ViewAction {
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
}
}

View File

@@ -0,0 +1,27 @@
package com.mapbox.mapboxsdk.testapp.style;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.style.RuntimeStyleTimingTestActivity;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Basic smoke tests for adding Layer and Source as early as possible (in onCreate)
*/
@RunWith(AndroidJUnit4.class)
public class RuntimeStyleTimingTests extends BaseTest {
@Override
protected Class getActivityClass() {
return RuntimeStyleTimingTestActivity.class;
}
@Test
public void testGetAddRemoveLayer() {
validateTestSetup();
// We're good if it didn't crash
}
}

View File

@@ -0,0 +1,59 @@
package com.mapbox.mapboxsdk.testapp.style;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.Style;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.EspressoTest;
import com.mapbox.mapboxsdk.testapp.utils.ResourceUtils;
import org.junit.Test;
import java.io.IOException;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static org.junit.Assert.assertEquals;
/**
* Tests around style loading
*/
public class StyleLoaderTest extends EspressoTest {
@Test
public void testSetGetStyleJsonString() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
try {
String expected = ResourceUtils.readRawResource(rule.getActivity(), R.raw.local_style);
mapboxMap.setStyle(new Style.Builder().fromJson(expected));
String actual = mapboxMap.getStyle().getJson();
assertEquals("Style json should match", expected, actual);
} catch (IOException exception) {
exception.printStackTrace();
}
});
}
@Test
public void testDefaultStyleLoadWithActivityLifecycleChange() {
validateTestSetup();
invoke(mapboxMap, (uiController, mapboxMap) -> {
try {
String expected = ResourceUtils.readRawResource(rule.getActivity(), R.raw.local_style);
mapboxMap.setStyle(new Style.Builder().fromJson(expected));
// fake activity stop/start
MapView mapView = (MapView) rule.getActivity().findViewById(R.id.mapView);
mapView.onPause();
mapView.onStop();
mapView.onStart();
mapView.onResume();
String actual = mapboxMap.getStyle().getJson();
assertEquals("Style URL should be empty", "", mapboxMap.getStyle().getUri());
assertEquals("Style json should match", expected, actual);
} catch (IOException exception) {
exception.printStackTrace();
}
});
}
}

View File

@@ -0,0 +1,285 @@
<%
const type = locals.type;
const properties = locals.properties;
-%>
// This file is generated. Edit scripts/generate-style-code.js, then run `make style-code`.
<% if (type === 'location-indicator') { -%>
package com.mapbox.mapboxsdk.location;
<% } else { -%>
package com.mapbox.mapboxsdk.testapp.style;
<% } -%>
import android.graphics.Color;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.geojson.LineString;
import com.mapbox.geojson.MultiLineString;
import com.mapbox.geojson.MultiPoint;
import com.mapbox.geojson.MultiPolygon;
import com.mapbox.geojson.Point;
import com.mapbox.geojson.Polygon;
import com.mapbox.mapboxsdk.maps.BaseLayerTest;
import org.junit.Before;
import timber.log.Timber;
import com.mapbox.mapboxsdk.style.expressions.Expression;
<% if (type !== 'location-indicator') { -%>
import com.mapbox.mapboxsdk.style.layers.<%- camelize(type) %>Layer;
<% } -%>
<% if (type === 'symbol') { -%>
import com.mapbox.mapboxsdk.style.types.Formatted;
import com.mapbox.mapboxsdk.style.types.FormattedSection;
<% } -%>
import org.junit.Test;
import org.junit.runner.RunWith;
import static com.mapbox.mapboxsdk.style.expressions.Expression.*;
import static org.junit.Assert.*;
import static com.mapbox.mapboxsdk.style.layers.Property.*;
<% if (type === 'location-indicator') { -%>
import static com.mapbox.mapboxsdk.location.LocationPropertyFactory.*;
<% } else { -%>
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.*;
<% } -%>
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Basic smoke tests for <%- camelize(type) %>Layer
*/
@RunWith(AndroidJUnit4.class)
public class <%- camelize(type) %>LayerTest extends BaseLayerTest {
private <%- camelize(type) %>Layer layer;
private final List<Point> pointsList = new ArrayList<Point>() {
{
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
add(Point.fromLngLat(55.29743486255916, 25.25827212207261));
add(Point.fromLngLat(55.28978863411328, 25.251356725509737));
add(Point.fromLngLat(55.300027931336984, 25.246425506635504));
add(Point.fromLngLat(55.307474692951274, 25.244200378933655));
add(Point.fromLngLat(55.31212891895635, 25.256408010450187));
add(Point.fromLngLat(55.30774064871093, 25.26266169122738));
add(Point.fromLngLat(55.301357710197806, 25.264946609615492));
add(Point.fromLngLat(55.30122473231012, 25.26476622289597));
}
};
@Before
@UiThreadTest
public void beforeTest(){
super.before();
<% if (type === 'background' || type === 'location-indicator') { -%>
layer = new <%- camelize(type) %>Layer("my-layer");
<% } else { -%>
layer = new <%- camelize(type) %>Layer("my-layer", "composite");
layer.setSourceLayer("composite");
<% } -%>
setupLayer(layer);
}
<% if (type !== 'background' && type !== 'location-indicator') { -%>
@Test
@UiThreadTest
public void testSourceId() {
Timber.i("SourceId");
assertNotNull(layer);
assertEquals(layer.getSourceId(), "composite");
}
<% } -%>
@Test
@UiThreadTest
public void testSetVisibility() {
Timber.i("Visibility");
assertNotNull(layer);
// Get initial
assertEquals(layer.getVisibility().getValue(), VISIBLE);
// Set
layer.setProperties(visibility(NONE));
assertEquals(layer.getVisibility().getValue(), NONE);
}
<% if (!(type === 'background' || type === 'location-indicator' || type === 'raster' || type === 'hillshade')) { -%>
@Test
@UiThreadTest
public void testSourceLayer() {
Timber.i("SourceLayer");
assertNotNull(layer);
// Get initial
assertEquals(layer.getSourceLayer(), "composite");
// Set
final String sourceLayer = "test";
layer.setSourceLayer(sourceLayer);
assertEquals(layer.getSourceLayer(), sourceLayer);
}
@Test
@UiThreadTest
public void testFilter() {
Timber.i("Filter");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// Set
Expression filter = eq(get("undefined"), literal(1.0));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// Set constant
filter = literal(true);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterDistance() {
Timber.i("FilterDistance");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
// distance with Point
Expression filter = lt(distance(Point.fromLngLat(1.0, 1.0)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with LineString
filter = lt(distance(LineString.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiPoint.fromLngLats(pointsList)), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPoint
filter = lt(distance(MultiLineString.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with Polygon
filter = lt(distance(Polygon.fromLngLats(Collections.singletonList(pointsList))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
// distance with MultiPolygon
filter = lt(distance(MultiPolygon.fromLngLats(Collections
.singletonList(Collections.singletonList(pointsList)))), 50);
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
@Test
@UiThreadTest
public void testFilterWithin() {
Timber.i("FilterWithin");
assertNotNull(layer);
// Get initial
assertEquals(layer.getFilter(), null);
Expression filter = within(Polygon.fromLngLats(Collections.singletonList(pointsList)));
layer.setFilter(filter);
assertEquals(layer.getFilter().toString(), filter.toString());
}
<% } -%>
<% for (const property of properties) { -%>
<% if (property['property-type'] !== 'color-ramp') { -%>
<% if (property.transition) { -%>
@Test
@UiThreadTest
public void test<%- camelize(property.name) %>Transition() {
Timber.i("<%- property.name %>TransitionOptions");
assertNotNull(layer);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
layer.set<%- camelize(property.name) %>Transition(options);
assertEquals(layer.get<%- camelize(property.name) %>Transition(), options);
}
<% } -%>
@Test
@UiThreadTest
public void test<%- camelize(property.name) %>AsConstant() {
Timber.i("<%- property.name %>");
assertNotNull(layer);
assertNull(layer.get<%- camelize(property.name) %>().getValue());
// Set and Get
<%- propertyType(property) %> propertyValue = <%- defaultValueJava(property) %>;
<% if (property.type === 'formatted') { -%>
layer.setProperties(<%- camelizeWithLeadingLowercase(property.name) %>("default"));
assertEquals(layer.get<%- camelize(property.name) %>().getValue(), propertyValue);
<% } -%>
layer.setProperties(<%- camelizeWithLeadingLowercase(property.name) %>(propertyValue));
assertEquals(layer.get<%- camelize(property.name) %>().getValue(), propertyValue);
<% if (property.tokens) { -%>
layer.setProperties(<%- camelizeWithLeadingLowercase(property.name) %>("{token}"));
<% if (property.type === 'formatted') { -%>
assertEquals(layer.get<%- camelize(property.name) %>().getExpression(), <%- defaultExpressionJava(property) %>(Expression.formatEntry(Expression.toString(Expression.get("token")))));
<% } else if (property.type === 'resolvedImage') {-%>
assertEquals(layer.get<%- camelize(property.name) %>().getExpression(), <%- defaultExpressionJava(property) %>(Expression.toString(Expression.get("token"))));
<% } else {-%>
assertEquals(layer.get<%- camelize(property.name) %>().getExpression(), Expression.toString(Expression.get("token")));
<% } -%>
<% } -%>
}
<% if (property['property-type'] === 'data-driven' || property['property-type'] === 'cross-faded-data-driven') { -%>
<% if (!(property.name.endsWith("-font")||property.name.endsWith("-offset"))) { -%>
@Test
@UiThreadTest
public void test<%- camelize(property.name) %>AsExpression() {
Timber.i("<%- property.name %>-expression");
assertNotNull(layer);
assertNull(layer.get<%- camelize(property.name) %>().getExpression());
// Set and Get
<% if (property.type === 'formatted') { -%>
Expression expression = <%- defaultExpressionJava(property) %>(Expression.formatEntry(Expression.get("undefined"), FormatOption.formatFontScale(2.0), FormatOption.formatTextFont(new String[]{"Open Sans Regular", "Arial Unicode MS Regular"})));
<% } else if (property.type === 'resolvedImage') { -%>
Expression expression = <%- defaultExpressionJava(property) %>(string(Expression.get("undefined")));
<% } else { -%>
Expression expression = <%- defaultExpressionJava(property) %>(Expression.get("undefined"));
<% } -%>
layer.setProperties(<%- camelizeWithLeadingLowercase(property.name) %>(expression));
assertEquals(layer.get<%- camelize(property.name) %>().getExpression(), expression);
}
<% } -%>
<% } -%>
<% if (property.type == 'color') { -%>
@Test
@UiThreadTest
public void test<%- camelize(property.name) %>AsIntConstant() {
Timber.i("<%- property.name %>");
assertNotNull(layer);
// Set and Get
layer.setProperties(<%- camelizeWithLeadingLowercase(property.name) %>(Color.argb(127, 255, 127, 0)));
assertEquals(layer.get<%- camelize(property.name) %>AsInt(), Color.argb(127, 255, 127, 0));
}
<% } -%>
<% } -%>
<% } -%>
}

View File

@@ -0,0 +1,132 @@
<%
const properties = locals.properties;
-%>
package com.mapbox.mapboxsdk.testapp.style;
import android.graphics.Color;
import androidx.test.espresso.UiController;
import androidx.test.espresso.ViewAction;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import android.view.View;
import com.mapbox.mapboxsdk.style.light.Light;
import com.mapbox.mapboxsdk.style.expressions.Expression;
import com.mapbox.mapboxsdk.style.layers.FillExtrusionLayer;
import com.mapbox.mapboxsdk.style.layers.TransitionOptions;
import com.mapbox.mapboxsdk.style.light.Position;
import com.mapbox.mapboxsdk.testapp.R;
import com.mapbox.mapboxsdk.testapp.activity.BaseTest;
import com.mapbox.mapboxsdk.testapp.activity.style.FillExtrusionStyleTestActivity;
import timber.log.Timber;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static com.mapbox.mapboxsdk.style.expressions.Expression.eq;
import static com.mapbox.mapboxsdk.style.layers.Property.ANCHOR_MAP;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionBase;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionColor;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionHeight;
import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionOpacity;
import static com.mapbox.mapboxsdk.testapp.action.MapboxMapAction.invoke;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
@RunWith(AndroidJUnit4.class)
public class LightTest extends BaseTest {
private Light light;
<% for (const property of properties) { -%>
<% if (property.transition) { -%>
@Test
public void test<%- camelize(property.name) %>Transition() {
validateTestSetup();
setupLight();
Timber.i("<%- property.name %>TransitionOptions");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
TransitionOptions options = new TransitionOptions(300, 100);
light.set<%- camelize(property.name) %>Transition(options);
assertEquals("Transition options should match", options, light.get<%- camelize(property.name) %>Transition());
});
}
<% } -%>
<% if (property.name == "position") { -%>
@Test
public void test<%- camelize(property.name) %>() {
validateTestSetup();
setupLight();
Timber.i("<%- property.name %>");
invoke(mapboxMap,(uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
Position position = new Position(1, 2, 3);
light.set<%- camelize(property.name) %>(position);
assertEquals("Position should match", position, light.get<%- camelize(property.name) %>());
});
}
<% } else { -%>
@Test
public void test<%- camelize(property.name) %>() {
validateTestSetup();
setupLight();
Timber.i("<%- property.name %>");
invoke(mapboxMap, (uiController, mapboxMap) -> {
assertNotNull(light);
// Set and Get
light.set<%- camelize(property.name) %>(<%- defaultValueJava(property) %>);
<% if (property.name == 'color') { -%>
assertEquals("<%- camelize(property.name) %> should match", <%- defaultValueJava(property) %>, light.get<%- camelize(property.name) %>());
<% } else { -%>
assertEquals("<%- camelize(property.name) %> should match", <%- defaultValueJava(property) %>, light.get<%- camelize(property.name) %>());
<% } -%>
});
}
<% } -%>
<% } -%>
private void setupLight() {
onView(withId(R.id.mapView)).perform(new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return getClass().getSimpleName();
}
@Override
public void perform(UiController uiController, View view) {
light = mapboxMap.getStyle().getLight();
FillExtrusionLayer fillExtrusionLayer = new FillExtrusionLayer("3d-buildings", "composite");
fillExtrusionLayer.setSourceLayer("building");
fillExtrusionLayer.setFilter(eq(Expression.get("extrude"), "true"));
fillExtrusionLayer.setMinZoom(15);
fillExtrusionLayer.setProperties(
fillExtrusionColor(Color.LTGRAY),
fillExtrusionHeight(Expression.get("height")),
fillExtrusionBase(Expression.get("min_height")),
fillExtrusionOpacity(0.6f)
);
mapboxMap.getStyle().addLayer(fillExtrusionLayer);
}
});
}
@Override
protected Class getActivityClass() {
return FillExtrusionStyleTestActivity.class;
}
}

View File

@@ -0,0 +1,38 @@
package com.mapbox.mapboxsdk.testapp.utils;
import androidx.test.espresso.IdlingResource;
import com.mapbox.mapboxsdk.testapp.activity.render.RenderTestActivity;
public class SnapshotterIdlingResource implements IdlingResource, RenderTestActivity.OnRenderTestCompletionListener {
private IdlingResource.ResourceCallback resourceCallback;
private boolean isSnapshotReady;
public SnapshotterIdlingResource(RenderTestActivity activity) {
activity.setOnRenderTestCompletionListener(this);
}
@Override
public String getName() {
return "SnapshotterIdlingResource";
}
@Override
public boolean isIdleNow() {
return isSnapshotReady;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback resourceCallback) {
this.resourceCallback = resourceCallback;
}
@Override
public void onFinish() {
isSnapshotReady = true;
if (resourceCallback != null) {
resourceCallback.onTransitionToIdle();
}
}
}

View File

@@ -0,0 +1,12 @@
package com.mapbox.mapboxsdk.testapp.utils;
public class TestConstants {
public static final double LAT_LNG_DELTA = 0.1;
public static final double BEARING_DELTA = 0.1;
public static final double TILT_DELTA = 0.3;
public static final double ZOOM_DELTA = 0.3;
public static final double PADDING_DELTA = 0.0001;
public static final String TEXT_MARKER_TITLE = "Marker";
public static final String TEXT_MARKER_SNIPPET = "Snippet";
}

View File

@@ -0,0 +1,18 @@
package com.mapbox.mapboxsdk.testapp.utils
import androidx.test.espresso.UiController
import com.mapbox.mapboxsdk.maps.MapView
object TestingAsyncUtils {
private const val DEFAULT_TIMEOUT = 15_000L
fun waitForLayer(uiController: UiController, mapView: MapView) {
val start = System.nanoTime() / 1E6
var isIdle = false
mapView.addOnDidBecomeIdleListener { isIdle = true }
while (!isIdle && System.nanoTime() / 1E6 - start < DEFAULT_TIMEOUT) {
uiController.loopMainThreadForAtLeast(100)
}
}
}

View File

@@ -0,0 +1,41 @@
package com.mapbox.mapboxsdk.utils;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.mapbox.mapboxsdk.constants.MapboxConstants;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@RunWith(AndroidJUnit4.class)
public class FontUtilsTest {
@Test
public void testExtractedFontShouldMatchDefault() {
String[] fonts = new String[] {"foo", "bar"};
String actual = FontUtils.extractValidFont(fonts);
assertEquals("Selected font should match", MapboxConstants.DEFAULT_FONT, actual);
}
@Test
public void testExtractedFontShouldMatchMonospace() {
String expected = "monospace";
String[] fonts = new String[] {"foo", expected};
String actual = FontUtils.extractValidFont(fonts);
assertEquals("Selected font should match", expected, actual);
}
@Test
public void testExtractedFontArrayShouldBeNull() {
String[] fonts = null;
String actual = FontUtils.extractValidFont(fonts);
assertNull(actual);
}
@Test
public void testExtractedFontShouldBeNull() {
String actual = FontUtils.extractValidFont(null);
assertNull(actual);
}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 B

Some files were not shown because too many files have changed in this diff Show More