blob: 0ec913163f1d25fa5817d1fb4918a5b9fcdbd522 [file] [log] [blame]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.wallpapereffectsgeneration.cts;
import static com.google.common.truth.Truth.assertThat;
import android.app.wallpapereffectsgeneration.CameraAttributes;
import android.app.wallpapereffectsgeneration.CinematicEffectResponse;
import android.app.wallpapereffectsgeneration.TexturedMesh;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Parcel;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* Tests for {@link CinematicEffectResponse}
*
* atest CtsWallpaperEffectsGenerationServiceTestCases
*/
@RunWith(AndroidJUnit4.class)
public class CinematicEffectResponseTest {
private static final String TAG = "WallpaperEffectsGenerationTest";
@Test
public void testCreateCinematicEffectResponse() {
final int statusCode = CinematicEffectResponse.CINEMATIC_EFFECT_STATUS_OK;
final String taskId = UUID.randomUUID().toString();
final int imageContentType = CinematicEffectResponse.IMAGE_CONTENT_TYPE_LANDSCAPE;
final Bitmap bmp = Bitmap.createBitmap(3200, 4800, Config.ARGB_8888);
final float[] vertices = WallpaperEffectsGenerationTestUtils.createVertices(1500000);
final int[] indices = WallpaperEffectsGenerationTestUtils.createIndices(1500000);
final int indicesLayoutType = TexturedMesh.INDICES_LAYOUT_TRIANGLES;
final int verticesLayoutType = TexturedMesh.VERTICES_LAYOUT_POSITION3_UV2;
final TexturedMesh texturedMesh = new TexturedMesh.Builder(bmp)
.setIndices(indices)
.setVertices(vertices)
.setIndicesLayoutType(indicesLayoutType)
.setVerticesLayoutType(verticesLayoutType).build();
List<TexturedMesh> texturedMeshes = new ArrayList<TexturedMesh>();
texturedMeshes.add(texturedMesh);
final float[] anchorPointInWorldSpace1 = new float[]{0.5f, 1.5f, -1.0f};
final float[] anchorPointInOutputUvSpace1 = new float[]{0.5f, 2.5f};
final float yaw1 = 35.2f;
final float pitch1 = 45.6f;
final float dolly1 = 0.3f;
final float fov1 = 60.0f;
final float frustumNear1 = 0.5f;
final float frustumFar1 = 200.0f;
final float[] anchorPointInWorldSpace2 = new float[]{0.6f, 1.6f, -1.1f};
final float[] anchorPointInOutputUvSpace2 = new float[]{0.6f, 2.6f};
final float yaw2 = 35.1f;
final float pitch2 = 45.4f;
final float dolly2 = 0.4f;
final float fov2 = 45.0f;
final float frustumNear2 = 0.6f;
final float frustumFar2 = 220.0f;
final CameraAttributes attributes1 =
new CameraAttributes.Builder(anchorPointInWorldSpace1,
anchorPointInOutputUvSpace1)
.setCameraOrbitYawDegrees(yaw1)
.setCameraOrbitPitchDegrees(pitch1)
.setDollyDistanceInWorldSpace(dolly1)
.setVerticalFovDegrees(fov1)
.setFrustumNearInWorldSpace(frustumNear1)
.setFrustumFarInWorldSpace(frustumFar1)
.build();
final CameraAttributes attributes2 =
new CameraAttributes.Builder(anchorPointInWorldSpace2,
anchorPointInOutputUvSpace2)
.setCameraOrbitYawDegrees(yaw2)
.setCameraOrbitPitchDegrees(pitch2)
.setDollyDistanceInWorldSpace(dolly2)
.setVerticalFovDegrees(fov2)
.setFrustumNearInWorldSpace(frustumNear2)
.setFrustumFarInWorldSpace(frustumFar2)
.build();
CinematicEffectResponse response =
new CinematicEffectResponse.Builder(statusCode, taskId)
.setImageContentType(imageContentType)
.setTexturedMeshes(texturedMeshes)
.setStartKeyFrame(attributes1)
.setEndKeyFrame(attributes2)
.build();
/** Check the original request. */
assertThat(response.getStatusCode()).isEqualTo(statusCode);
assertThat(response.getTaskId()).isEqualTo(taskId);
assertThat(response.getImageContentType()).isEqualTo(imageContentType);
assertThat(response.getTexturedMeshes().size()).isEqualTo(1);
final TexturedMesh mesh = response.getTexturedMeshes().get(0);
assertThat(mesh.getBitmap()).isEqualTo(bmp);
assertThat(mesh.getIndices()).isEqualTo(indices);
assertThat(mesh.getVertices()).isEqualTo(vertices);
assertThat(mesh.getIndicesLayoutType()).isEqualTo(indicesLayoutType);
assertThat(mesh.getVerticesLayoutType()).isEqualTo(verticesLayoutType);
CameraAttributes startAttributes = response.getStartKeyFrame();
assertThat(startAttributes.getAnchorPointInWorldSpace()).isEqualTo(
anchorPointInWorldSpace1);
assertThat(startAttributes.getAnchorPointInOutputUvSpace()).isEqualTo(
anchorPointInOutputUvSpace1);
assertThat(startAttributes.getCameraOrbitYawDegrees()).isEqualTo(yaw1);
assertThat(startAttributes.getCameraOrbitPitchDegrees()).isEqualTo(pitch1);
assertThat(startAttributes.getDollyDistanceInWorldSpace()).isEqualTo(dolly1);
assertThat(startAttributes.getVerticalFovDegrees()).isEqualTo(fov1);
assertThat(startAttributes.getFrustumNearInWorldSpace()).isEqualTo(frustumNear1);
assertThat(startAttributes.getFrustumFarInWorldSpace()).isEqualTo(frustumFar1);
CameraAttributes endAttributes = response.getEndKeyFrame();
assertThat(endAttributes.getAnchorPointInWorldSpace()).isEqualTo(anchorPointInWorldSpace2);
assertThat(endAttributes.getAnchorPointInOutputUvSpace()).isEqualTo(
anchorPointInOutputUvSpace2);
assertThat(endAttributes.getCameraOrbitYawDegrees()).isEqualTo(yaw2);
assertThat(endAttributes.getCameraOrbitPitchDegrees()).isEqualTo(pitch2);
assertThat(endAttributes.getDollyDistanceInWorldSpace()).isEqualTo(dolly2);
assertThat(endAttributes.getVerticalFovDegrees()).isEqualTo(fov2);
assertThat(endAttributes.getFrustumNearInWorldSpace()).isEqualTo(frustumNear2);
assertThat(endAttributes.getFrustumFarInWorldSpace()).isEqualTo(frustumFar2);
Parcel parcel = Parcel.obtain();
parcel.setDataPosition(0);
response.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
CinematicEffectResponse copy =
CinematicEffectResponse.CREATOR.createFromParcel(parcel);
/** Check the copied response. */
assertThat(copy.getStatusCode()).isEqualTo(statusCode);
assertThat(copy.getTaskId()).isEqualTo(taskId);
assertThat(copy.getImageContentType()).isEqualTo(imageContentType);
assertThat(copy.getTexturedMeshes().size()).isEqualTo(1);
final TexturedMesh meshCopy = copy.getTexturedMeshes().get(0);
assertThat(meshCopy.getBitmap().sameAs(bmp)).isTrue();
assertThat(meshCopy.getIndices()).isEqualTo(indices);
assertThat(meshCopy.getVertices()).isEqualTo(vertices);
assertThat(meshCopy.getIndicesLayoutType()).isEqualTo(indicesLayoutType);
assertThat(meshCopy.getVerticesLayoutType()).isEqualTo(verticesLayoutType);
CameraAttributes startAttributesCopy = copy.getStartKeyFrame();
assertThat(startAttributesCopy.getAnchorPointInWorldSpace()).isEqualTo(
anchorPointInWorldSpace1);
assertThat(startAttributesCopy.getAnchorPointInOutputUvSpace()).isEqualTo(
anchorPointInOutputUvSpace1);
assertThat(startAttributesCopy.getCameraOrbitYawDegrees()).isEqualTo(yaw1);
assertThat(startAttributesCopy.getCameraOrbitPitchDegrees()).isEqualTo(pitch1);
assertThat(startAttributesCopy.getDollyDistanceInWorldSpace()).isEqualTo(dolly1);
assertThat(startAttributesCopy.getVerticalFovDegrees()).isEqualTo(fov1);
assertThat(startAttributesCopy.getFrustumNearInWorldSpace()).isEqualTo(frustumNear1);
assertThat(startAttributesCopy.getFrustumFarInWorldSpace()).isEqualTo(frustumFar1);
CameraAttributes endAttributesCopy = copy.getEndKeyFrame();
assertThat(endAttributesCopy.getAnchorPointInWorldSpace())
.isEqualTo(anchorPointInWorldSpace2);
assertThat(endAttributesCopy.getAnchorPointInOutputUvSpace()).isEqualTo(
anchorPointInOutputUvSpace2);
assertThat(endAttributesCopy.getCameraOrbitYawDegrees()).isEqualTo(yaw2);
assertThat(endAttributesCopy.getCameraOrbitPitchDegrees()).isEqualTo(pitch2);
assertThat(endAttributesCopy.getDollyDistanceInWorldSpace()).isEqualTo(dolly2);
assertThat(endAttributesCopy.getVerticalFovDegrees()).isEqualTo(fov2);
assertThat(endAttributesCopy.getFrustumNearInWorldSpace()).isEqualTo(frustumNear2);
assertThat(endAttributesCopy.getFrustumFarInWorldSpace()).isEqualTo(frustumFar2);
parcel.recycle();
}
}