import { render } from '@testing-library/react';
import type { CommentData } from './APIDataTypes';
import { CommentTextBlock, resolveTypeName } from './APISectionUtils';
describe('APISectionUtils.resolveTypeName', () => {
test('void', () => {
const { container } = render(<>{resolveTypeName({ type: 'intrinsic', name: 'void' })}>);
expect(container).toMatchSnapshot();
});
test('generic type', () => {
const { container } = render(<>{resolveTypeName({ type: 'intrinsic', name: 'string' })}>);
expect(container).toMatchSnapshot();
});
test('custom type', () => {
const { container } = render(
<>{resolveTypeName({ type: 'reference', name: 'SpeechSynthesisEvent' })}>
);
expect(container).toMatchSnapshot();
});
test('custom type array', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'array',
elementType: { type: 'reference', name: 'AppleAuthenticationScope' },
})}
>
);
expect(container).toMatchSnapshot();
});
test('custom type non-linkable array', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'array',
elementType: { type: 'reference', name: 'T' },
})}
>
);
expect(container).toMatchSnapshot();
});
test('query type', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [{ queryType: { type: 'reference', name: 'View' }, type: 'query' }],
name: 'React.ComponentProps',
})}
>
);
expect(container).toMatchSnapshot();
});
test('Promise', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [{ type: 'intrinsic', name: 'void' }],
name: 'Promise',
})}
>
);
expect(container).toMatchSnapshot();
});
test('Promise with custom type', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [{ type: 'reference', name: 'AppleAuthenticationCredential' }],
name: 'Promise',
})}
>
);
expect(container).toMatchSnapshot();
});
test('Record', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [
{ type: 'intrinsic', name: 'string' },
{ type: 'intrinsic', name: 'any' },
],
name: 'Record',
})}
>
);
expect(container).toMatchSnapshot();
});
test('alternative generic object notation', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'array',
elementType: {
type: 'reflection',
declaration: {
name: '__type',
indexSignature: {
name: '__index',
parameters: [{ name: 'column', type: { type: 'intrinsic', name: 'string' } }],
type: { type: 'intrinsic', name: 'any' },
},
},
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('Record with union', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [
{ type: 'intrinsic', name: 'string' },
{
type: 'union',
types: [
{ type: 'intrinsic', name: 'number' },
{ type: 'intrinsic', name: 'boolean' },
{ type: 'intrinsic', name: 'string' },
],
},
],
name: 'Record',
})}
>
);
expect(container).toMatchSnapshot();
});
test('union', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'union',
types: [
{ type: 'reference', name: 'SpeechEventCallback' },
{ type: 'literal', value: null },
],
})}
>
);
expect(container).toMatchSnapshot();
});
test('union with array', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'union',
types: [
{ type: 'array', elementType: { type: 'intrinsic', name: 'number' } },
{ type: 'literal', value: null },
],
})}
>
);
expect(container).toMatchSnapshot();
});
test('union with custom type and array', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'union',
types: [
{ type: 'array', elementType: { type: 'reference', name: 'AssetRef' } },
{ type: 'reference', name: 'AssetRef' },
],
})}
>
);
expect(container).toMatchSnapshot();
});
test('union of array values', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'array',
elementType: {
type: 'union',
types: [
{ type: 'reference', name: 'ResultSetError' },
{ type: 'reference', name: 'ResultSet' },
],
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('generic type', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [{ type: 'reference', name: 'Asset' }],
name: 'PagedInfo',
})}
>
);
expect(container).toMatchSnapshot();
});
test('tuple type', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'tuple',
elements: [
{ type: 'reference', name: 'SortByKey' },
{ type: 'intrinsic', name: 'boolean' },
],
})}
>
);
expect(container).toMatchSnapshot();
});
test('generic type in Promise', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [
{
type: 'reference',
typeArguments: [{ type: 'reference', name: 'Asset' }],
name: 'PagedInfo',
},
],
name: 'Promise',
})}
>
);
expect(container).toMatchSnapshot();
});
test('function', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reflection',
declaration: {
signatures: [
{
type: {
type: 'union',
types: [
{ type: 'intrinsic', name: 'void' },
{
type: 'reference',
name: 'SpeechEventCallback',
},
],
},
},
],
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('function with arguments', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reflection',
declaration: {
signatures: [
{
parameters: [
{
name: 'error',
type: { type: 'reference', name: 'Error' },
},
],
type: {
type: 'union',
types: [
{ type: 'intrinsic', name: 'void' },
{ type: 'reference', name: 'SpeechEventCallback' },
],
},
},
],
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('function with non-linkable custom type', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reflection',
declaration: {
signatures: [
{
parameters: [
{
name: 'error',
type: { type: 'reference', name: 'Error' },
},
],
type: { type: 'intrinsic', name: 'void' },
},
],
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('object reflection', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reflection',
declaration: {
children: [
{
name: 'target',
type: { type: 'intrinsic', name: 'number' },
},
{
name: 'value',
type: { type: 'intrinsic', name: 'boolean' },
},
],
},
})}
>
);
expect(container).toMatchSnapshot();
});
test('custom type with single pick', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [
{ type: 'reference', name: 'FontResource' },
{ type: 'literal', value: 'display' },
],
name: 'Pick',
})}
>
);
expect(container).toMatchSnapshot();
});
test('props with multiple omits', () => {
const { container } = render(
<>
{resolveTypeName({
type: 'reference',
typeArguments: [
{
type: 'reference',
typeArguments: [
{ type: 'reference', name: 'ViewStyle' },
{
type: 'union',
types: [
{ type: 'literal', value: 'backgroundColor' },
{
type: 'literal',
value: 'borderRadius',
},
],
},
],
name: 'Omit',
},
],
name: 'StyleProp',
})}
>
);
expect(container).toMatchSnapshot();
});
});
describe('APISectionUtils.CommentTextBlock component', () => {
test('no comment', () => {
const { container } = render();
expect(container).toMatchSnapshot();
});
test('basic comment', () => {
const comment: CommentData = {
summary: [{ kind: 'text', text: 'This is the basic comment.' }],
};
const { container } = render();
expect(container).toMatchSnapshot();
});
test('comment with example', () => {
const comment: CommentData = {
summary: [
{
kind: 'text',
text: 'Gets the referrer URL of the installed app with the [',
},
{
kind: 'code',
text: '`Install Referrer API`',
},
{
kind: 'text',
text: '](https://developer.android.com/google/play/installreferrer)\nfrom the Google Play Store. In practice, the referrer URL may not be a complete, absolute URL.',
},
],
blockTags: [
{
tag: '@returns',
content: [
{
kind: 'text',
text: 'A ',
},
{
kind: 'code',
text: '`Promise`',
},
{
kind: 'text',
text: ' that fulfills with a ',
},
{
kind: 'code',
text: '`string`',
},
{
kind: 'text',
text: ' of the referrer URL of the installed app.',
},
],
},
{
tag: '@example',
content: [
{
kind: 'code',
text: '```ts\nawait Application.getInstallReferrerAsync();\n// "utm_source=google-play&utm_medium=organic"\n```',
},
],
},
{
tag: '@platform',
content: [
{
kind: 'text',
text: 'android',
},
],
},
],
};
const { container } = render();
expect(container).toMatchSnapshot();
});
});