Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
실시간 편집
공백 변경 숨기기
변경 없는 행 숨기기
줄바꿈 비활성화
레이아웃
나란히 보기
합쳐 보기
비교 단위
스마트
단어
글자
텍스트 스타일
모양 변경
구문 강조
언어 선택
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
icon spec test diff
생성일
그저께
비교 결과 만료까지
4주 후
초기화
내보내기
공유
설명
0 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
79 행
복사
121 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
195 행
복사
import { newSpecPage } from 'jest-stencil-runner';
import { newSpecPage } from 'jest-stencil-runner';
import { Icon } from '../icon';
import { Icon } from '../icon';
describe('icon', () => {
describe('icon', () => {
it('renders', async () => {
it('renders', async () => {
const { root } = await newSpecPage({
const { root } = await newSpecPage({
components: [Icon],
components: [Icon],
html: '<ion-icon></ion-icon>',
html: '<ion-icon></ion-icon>',
});
});
expect(root).toEqualHtml(`
expect(root).toEqualHtml(`
<ion-icon class="md" role="img">
<ion-icon class="md" role="img">
<mock:shadow-root>
<mock:shadow-root>
복사
복사됨
복사
복사됨
<div class="icon-inner">
</div>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
</mock:shadow-root>
</ion-icon>
</ion-icon>
`);
`);
});
});
it('renders rtl with aria-hidden', async () => {
it('renders rtl with aria-hidden', async () => {
const { root } = await newSpecPage({
const { root } = await newSpecPage({
components: [Icon],
components: [Icon],
direction: 'rtl',
direction: 'rtl',
html: `<ion-icon name="chevron-forward" aria-hidden="true"></ion-icon>`,
html: `<ion-icon name="chevron-forward" aria-hidden="true"></ion-icon>`,
});
});
expect(root).toEqualHtml(`
expect(root).toEqualHtml(`
<ion-icon class="md flip-rtl icon-rtl" name="chevron-forward" role="img" aria-hidden="true">
<ion-icon class="md flip-rtl icon-rtl" name="chevron-forward" role="img" aria-hidden="true">
<mock:shadow-root>
<mock:shadow-root>
복사
복사됨
복사
복사됨
<div class="icon-inner">
</div>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
</mock:shadow-root>
</ion-icon>
</ion-icon>
`);
`);
});
});
it('renders custom aria-label', async () => {
it('renders custom aria-label', async () => {
const { root } = await newSpecPage({
const { root } = await newSpecPage({
components: [Icon],
components: [Icon],
html: `<ion-icon name="star" aria-label="custom label"></ion-icon>`,
html: `<ion-icon name="star" aria-label="custom label"></ion-icon>`,
});
});
expect(root).toEqualHtml(`
expect(root).toEqualHtml(`
<ion-icon class="md" name="star" role="img" aria-label="custom label">
<ion-icon class="md" name="star" role="img" aria-label="custom label">
<mock:shadow-root>
<mock:shadow-root>
복사
복사됨
복사
복사됨
<div class="icon-inner">
</div>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
</mock:shadow-root>
</ion-icon>
</ion-icon>
`);
`);
});
});
it('renders custom label after changing source', async () => {
it('renders custom label after changing source', async () => {
const page = await newSpecPage({
const page = await newSpecPage({
components: [Icon],
components: [Icon],
html: `<ion-icon name="chevron-forward" aria-label="custom label"></ion-icon>`,
html: `<ion-icon name="chevron-forward" aria-label="custom label"></ion-icon>`,
});
});
const icon = page.root;
const icon = page.root;
expect(icon).toEqualHtml(`
expect(icon).toEqualHtml(`
<ion-icon class="flip-rtl md" name="chevron-forward" role="img" aria-label="custom label">
<ion-icon class="flip-rtl md" name="chevron-forward" role="img" aria-label="custom label">
<mock:shadow-root>
<mock:shadow-root>
복사
복사됨
복사
복사됨
<div class="icon-inner">
</div>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
</mock:shadow-root>
</ion-icon>
</ion-icon>
`);
`);
if (icon) {
if (icon) {
icon.name = 'trash';
icon.name = 'trash';
}
}
await page.waitForChanges();
await page.waitForChanges();
expect(icon).toEqualHtml(`
expect(icon).toEqualHtml(`
<ion-icon class="md" name="trash" role="img" aria-label="custom label">
<ion-icon class="md" name="trash" role="img" aria-label="custom label">
<mock:shadow-root>
<mock:shadow-root>
복사
복사됨
복사
복사됨
<div class="icon-inner">
</div>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
</mock:shadow-root>
</ion-icon>
</ion-icon>
`);
`);
});
});
복사
복사됨
복사
복사됨
it('svgContent=true: renders svg without slot', async () => {
const page = await newSpecPage({
components: [Icon],
html: `<ion-icon aria-hidden="true" part="close-icon" class="close-icon"></ion-icon>`,
});
const icon = page.root as any;
const instance = page.rootInstance as any;
instance.svgContent = '<svg><circle cx="50" cy="50" r="40"/></svg>';
await page.waitForChanges();
const shadowRoot = icon.shadowRoot;
const iconInner = shadowRoot?.querySelector('.icon-inner');
// Should have no slot
const slot = iconInner?.querySelector('slot');
expect(slot).toBeNull();
// SVG should be a direct child of icon-inner,
// not nested in another div
expect(iconInner?.children.length).toBe(1);
const firstChild = iconInner?.children[0];
expect((firstChild as any)?.tagName?.toLowerCase()).toBe('svg');
expect(firstChild?.querySelector('circle')).not.toBeNull();
});
it('svgContent=false: renders slot for custom content', async () => {
const page = await newSpecPage({
components: [Icon],
html: `<ion-icon aria-hidden="true" part="close-icon" class="close-icon"></ion-icon>`,
});
const icon = page.root as any;
const shadowRoot = icon.shadowRoot;
const iconInner = shadowRoot?.querySelector('.icon-inner');
const slot = iconInner?.querySelector('slot');
const svg = iconInner?.querySelector('svg');
expect(slot).not.toBeNull();
expect(svg).toBeNull();
});
it('renders slotted font icon (Font Awesome)', async () => {
const { root } = await newSpecPage({
components: [Icon],
html: `
<ion-icon>
<i class="fa fa-home"></i>
</ion-icon>
`,
});
expect(root).toEqualHtml(`
<ion-icon class="md" role="img">
<mock:shadow-root>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
<i class="fa fa-home"></i>
</ion-icon>
`);
});
it('renders slotted font icon with color', async () => {
const { root } = await newSpecPage({
components: [Icon],
html: `
<ion-icon color="primary">
<i class="fa fa-heart"></i>
</ion-icon>
`,
});
expect(root).toEqualHtml(`
<ion-icon class="md ion-color ion-color-primary" color="primary" role="img">
<mock:shadow-root>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
<i class="fa fa-heart"></i>
</ion-icon>
`);
});
it('renders slotted font icon with custom style', async () => {
const { root } = await newSpecPage({
components: [Icon],
html: `
<ion-icon style="font-size: 48px">
<i class="fa fa-star"></i>
</ion-icon>
`,
});
expect(root).toEqualHtml(`
<ion-icon class="md" role="img" style="font-size: 48px">
<mock:shadow-root>
<div class="icon-inner">
<slot></slot>
</div>
</mock:shadow-root>
<i class="fa fa-star"></i>
</ion-icon>
`);
});
});
});
복사
복사됨
복사
복사됨
저장된 비교 결과
원본
파일 열기
import { newSpecPage } from 'jest-stencil-runner'; import { Icon } from '../icon'; describe('icon', () => { it('renders', async () => { const { root } = await newSpecPage({ components: [Icon], html: '<ion-icon></ion-icon>', }); expect(root).toEqualHtml(` <ion-icon class="md" role="img"> <mock:shadow-root> <div class="icon-inner"></div> </mock:shadow-root> </ion-icon> `); }); it('renders rtl with aria-hidden', async () => { const { root } = await newSpecPage({ components: [Icon], direction: 'rtl', html: `<ion-icon name="chevron-forward" aria-hidden="true"></ion-icon>`, }); expect(root).toEqualHtml(` <ion-icon class="md flip-rtl icon-rtl" name="chevron-forward" role="img" aria-hidden="true"> <mock:shadow-root> <div class="icon-inner"></div> </mock:shadow-root> </ion-icon> `); }); it('renders custom aria-label', async () => { const { root } = await newSpecPage({ components: [Icon], html: `<ion-icon name="star" aria-label="custom label"></ion-icon>`, }); expect(root).toEqualHtml(` <ion-icon class="md" name="star" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"></div> </mock:shadow-root> </ion-icon> `); }); it('renders custom label after changing source', async () => { const page = await newSpecPage({ components: [Icon], html: `<ion-icon name="chevron-forward" aria-label="custom label"></ion-icon>`, }); const icon = page.root; expect(icon).toEqualHtml(` <ion-icon class="flip-rtl md" name="chevron-forward" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"></div> </mock:shadow-root> </ion-icon> `); if (icon) { icon.name = 'trash'; } await page.waitForChanges(); expect(icon).toEqualHtml(` <ion-icon class="md" name="trash" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"></div> </mock:shadow-root> </ion-icon> `); }); });
수정본
파일 열기
import { newSpecPage } from 'jest-stencil-runner'; import { Icon } from '../icon'; describe('icon', () => { it('renders', async () => { const { root } = await newSpecPage({ components: [Icon], html: '<ion-icon></ion-icon>', }); expect(root).toEqualHtml(` <ion-icon class="md" role="img"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> </ion-icon> `); }); it('renders rtl with aria-hidden', async () => { const { root } = await newSpecPage({ components: [Icon], direction: 'rtl', html: `<ion-icon name="chevron-forward" aria-hidden="true"></ion-icon>`, }); expect(root).toEqualHtml(` <ion-icon class="md flip-rtl icon-rtl" name="chevron-forward" role="img" aria-hidden="true"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> </ion-icon> `); }); it('renders custom aria-label', async () => { const { root } = await newSpecPage({ components: [Icon], html: `<ion-icon name="star" aria-label="custom label"></ion-icon>`, }); expect(root).toEqualHtml(` <ion-icon class="md" name="star" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> </ion-icon> `); }); it('renders custom label after changing source', async () => { const page = await newSpecPage({ components: [Icon], html: `<ion-icon name="chevron-forward" aria-label="custom label"></ion-icon>`, }); const icon = page.root; expect(icon).toEqualHtml(` <ion-icon class="flip-rtl md" name="chevron-forward" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> </ion-icon> `); if (icon) { icon.name = 'trash'; } await page.waitForChanges(); expect(icon).toEqualHtml(` <ion-icon class="md" name="trash" role="img" aria-label="custom label"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> </ion-icon> `); }); it('svgContent=true: renders svg without slot', async () => { const page = await newSpecPage({ components: [Icon], html: `<ion-icon aria-hidden="true" part="close-icon" class="close-icon"></ion-icon>`, }); const icon = page.root as any; const instance = page.rootInstance as any; instance.svgContent = '<svg><circle cx="50" cy="50" r="40"/></svg>'; await page.waitForChanges(); const shadowRoot = icon.shadowRoot; const iconInner = shadowRoot?.querySelector('.icon-inner'); // Should have no slot const slot = iconInner?.querySelector('slot'); expect(slot).toBeNull(); // SVG should be a direct child of icon-inner, // not nested in another div expect(iconInner?.children.length).toBe(1); const firstChild = iconInner?.children[0]; expect((firstChild as any)?.tagName?.toLowerCase()).toBe('svg'); expect(firstChild?.querySelector('circle')).not.toBeNull(); }); it('svgContent=false: renders slot for custom content', async () => { const page = await newSpecPage({ components: [Icon], html: `<ion-icon aria-hidden="true" part="close-icon" class="close-icon"></ion-icon>`, }); const icon = page.root as any; const shadowRoot = icon.shadowRoot; const iconInner = shadowRoot?.querySelector('.icon-inner'); const slot = iconInner?.querySelector('slot'); const svg = iconInner?.querySelector('svg'); expect(slot).not.toBeNull(); expect(svg).toBeNull(); }); it('renders slotted font icon (Font Awesome)', async () => { const { root } = await newSpecPage({ components: [Icon], html: ` <ion-icon> <i class="fa fa-home"></i> </ion-icon> `, }); expect(root).toEqualHtml(` <ion-icon class="md" role="img"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> <i class="fa fa-home"></i> </ion-icon> `); }); it('renders slotted font icon with color', async () => { const { root } = await newSpecPage({ components: [Icon], html: ` <ion-icon color="primary"> <i class="fa fa-heart"></i> </ion-icon> `, }); expect(root).toEqualHtml(` <ion-icon class="md ion-color ion-color-primary" color="primary" role="img"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> <i class="fa fa-heart"></i> </ion-icon> `); }); it('renders slotted font icon with custom style', async () => { const { root } = await newSpecPage({ components: [Icon], html: ` <ion-icon style="font-size: 48px"> <i class="fa fa-star"></i> </ion-icon> `, }); expect(root).toEqualHtml(` <ion-icon class="md" role="img" style="font-size: 48px"> <mock:shadow-root> <div class="icon-inner"> <slot></slot> </div> </mock:shadow-root> <i class="fa fa-star"></i> </ion-icon> `); }); });
비교하기