Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions packages/rn-tester/.maestro/image.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,21 @@
appId: ${APP_ID} # iOS: com.meta.RNTester.localDevelopment | Android: com.facebook.react.uiapp
---
- launchApp
- assertVisible: "Components"
- scrollUntilVisible:
element:
id: "Image"
direction: DOWN
speed: 40
- runFlow: ./helpers/launch-app-and-search.yml
- inputText:
text: "Image"
- assertVisible:
id: "Image"
- tapOn:
id: "Image"
- assertVisible: "Plain Network Image with `source` prop."
- assertVisible:
id: "example_search"
- tapOn:
id: "example_search"
- inputText:
text: "Image.getSize"
- hideKeyboard
- assertVisible: "Calling Image.getSize for 3 remote images."
- extendedWaitUntil:
visible: "1 Pass"
timeout: 30000
122 changes: 122 additions & 0 deletions packages/rn-tester/js/examples/Image/ImageExample.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@
'use strict';

import type {RNTesterModuleExample} from '../../types/RNTesterTypes';
import type {PlatformTestComponentBaseProps} from '../Experimental/PlatformTest/RNTesterPlatformTestTypes';
import type {ImageProps, LayoutChangeEvent} from 'react-native';

import RNTesterButton from '../../components/RNTesterButton';
import RNTesterText from '../../components/RNTesterText';
import RNTesterPlatformTest from '../Experimental/PlatformTest/RNTesterPlatformTest';
import ImageCapInsetsExample from './ImageCapInsetsExample';
import * as React from 'react';
import {useEffect, useState} from 'react';
Expand Down Expand Up @@ -673,6 +675,114 @@ const smallImage = {
uri: IMAGE1,
};

const GET_SIZE_TEST_IMAGES: ReadonlyArray<{
expectedHeight: number,
expectedWidth: number,
uri: string,
name: string,
}> = [
{
expectedHeight: 492,
expectedWidth: 960,
uri: IMAGE1,
name: 'large PNG',
},
{
expectedHeight: 3000,
expectedWidth: 4500,
uri: 'https://images.pexels.com/photos/842711/pexels-photo-842711.jpeg?auto=compress&cs=tinysrgb&w=2250&h=1500&dpr=2',
name: 'large JPEG with density 2',
},
{
expectedHeight: 1200,
expectedWidth: 1800,
// Rotated 90 degrees counter-clockwise
uri: 'https://raw.githubusercontent.com/recurser/exif-orientation-examples/master/Landscape_6.jpg',
name: 'EXIF rotated JPEG',
},
];

function getImageSize(uri: string): Promise<{height: number, width: number}> {
return new Promise((resolve, reject) => {
Image.getSize(uri, (width, height) => resolve({height, width}), reject);
});
}

type ImageGetSizeTestStatus = 'pending' | 'passed' | 'failed';

function ImageGetSizePlatformTest(props: PlatformTestComponentBaseProps) {
const {harness} = props;
const [status, setStatus] = useState<ImageGetSizeTestStatus>('pending');
const asyncTest = harness.useAsyncTest(
'Image.getSize resolves source dimensions',
30000,
);

useEffect(() => {
let cancelled = false;

Promise.all(
GET_SIZE_TEST_IMAGES.map(image =>
getImageSize(image.uri).then(size => ({image, size})),
),
)
.then(results => {
if (cancelled) {
return;
}

let passed = true;
for (const result of results) {
passed =
passed &&
result.size.width === result.image.expectedWidth &&
result.size.height === result.image.expectedHeight;

asyncTest.step(({assert_equals}) => {
assert_equals(
result.size.width,
result.image.expectedWidth,
`${result.image.name} width`,
);
assert_equals(
result.size.height,
result.image.expectedHeight,
`${result.image.name} height`,
);
});
}

setStatus(passed ? 'passed' : 'failed');
})
.catch((error: unknown) => {
if (!cancelled) {
asyncTest.step(({assert_true}) => {
assert_true(false, `Image.getSize failed: ${String(error)}`);
});
setStatus('failed');
}
})
.finally(() => {
if (!cancelled) {
asyncTest.done();
}
});

return () => {
cancelled = true;
};
}, [asyncTest]);

return (
<>
<RNTesterText>
Calling Image.getSize for {GET_SIZE_TEST_IMAGES.length} remote images.
</RNTesterText>
{status === 'passed' ? <RNTesterText>1 Pass</RNTesterText> : null}
</>
);
}

const styles = StyleSheet.create({
base: {
width: 64,
Expand Down Expand Up @@ -1564,6 +1674,18 @@ exports.examples = [
return <ImageSizeExample source={fullImage} />;
},
},
{
title: 'Image.getSize',
render: function (): React.Node {
return (
<RNTesterPlatformTest
title="Image.getSize"
description="Calls Image.getSize and verifies the source dimensions returned by native image metadata."
component={ImageGetSizePlatformTest}
/>
);
},
},
{
title: 'MultipleSourcesExample',
description:
Expand Down
Loading