canvas tests

This commit is contained in:
Will Scullin 2021-05-11 20:59:43 -07:00
parent c9df0d491d
commit dadf1a7fc7
No known key found for this signature in database
GPG Key ID: 26DCD1042C6638CD
13 changed files with 208 additions and 0 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@
/dist
/node_modules
/tmp
__diff_output__

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,10 @@
export const screenEmu = (function () {
return {
DisplayConfiguration: class {},
Point: class {},
ScreenView: class {
initOpenGL() {}
},
Size: class{},
};
})();

197
test/js/gl.test.ts Normal file
View File

@ -0,0 +1,197 @@
/** @fileoverview Test for canvas.ts. */
import { VideoPage } from 'js/videomodes';
import { LoresPageGL, HiresPageGL, VideoModesGL } from 'js/gl';
import apple2enh_char from 'js/roms/apple2enh_char';
import { createImageFromImageData } from 'test/util/image';
function checkImageData(page: VideoPage) {
page.refresh();
const img = createImageFromImageData(page.imageData);
expect(img).toMatchImageSnapshot();
}
describe('gl', () => {
describe('LoresPage', () => {
let canvas: HTMLCanvasElement;
let lores1: LoresPageGL;
let vm: VideoModesGL;
beforeEach(async () => {
canvas = document.createElement('canvas');
vm = new VideoModesGL(canvas, true);
await vm.ready;
lores1 = new LoresPageGL(vm, 1, apple2enh_char, true);
vm.reset();
vm.hires(false);
});
describe('text mode', () => {
describe('40 column', () => {
it('renders', () => {
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
lores1.write(page, off, off);
}
}
checkImageData(lores1);
});
it('renders alt chars', () => {
vm.altChar(true);
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
lores1.write(page, off, off);
}
}
checkImageData(lores1);
});
});
describe('80 column', () => {
it('renders', () => {
vm._80col(true);
const bank0 = lores1.bank0();
const bank1 = lores1.bank1();
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
bank0.write(page, off, off);
bank1.write(page, off, 255 - off);
}
}
checkImageData(lores1);
});
it('renders alt chars', () => {
vm.altChar(true);
vm._80col(true);
const bank0 = lores1.bank0();
const bank1 = lores1.bank1();
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
bank0.write(page, off, off);
bank1.write(page, off, 255 - off);
}
}
checkImageData(lores1);
});
});
});
describe('graphics mode', () => {
describe('lores', () => {
it('renders', () => {
vm.text(false);
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
lores1.write(page, off, off);
}
}
checkImageData(lores1);
});
it('renders mixed', () => {
vm.text(false);
vm.mixed(true);
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
lores1.write(page, off, off);
}
}
checkImageData(lores1);
});
});
describe('double lores', () => {
it('renders', () => {
vm.text(false);
vm._80col(true);
vm.an3(false);
const bank0 = lores1.bank0();
const bank1 = lores1.bank1();
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
bank0.write(page, off, off);
bank1.write(page, off, 255 - off);
}
}
checkImageData(lores1);
});
it('renders mixed', () => {
vm.text(false);
vm.mixed(true);
vm._80col(true);
vm.an3(false);
const bank0 = lores1.bank0();
const bank1 = lores1.bank1();
for (let page = 0x4; page < 0x8; page++) {
for (let off = 0; off < 0x100; off++) {
bank0.write(page, off, off);
bank1.write(page, off, 255 - off);
}
}
checkImageData(lores1);
});
});
});
});
describe('HiresPage', () => {
let canvas: HTMLCanvasElement;
let hires1: HiresPageGL;
let vm: VideoModesGL;
beforeEach(() => {
canvas = document.createElement('canvas');
vm = new VideoModesGL(canvas, true);
hires1 = new HiresPageGL(vm, 1);
vm.reset();
vm.hires(true);
});
describe('hires', () => {
it('renders', () => {
vm.text(false);
for (let page = 0x20; page < 0x40; page++) {
for (let off = 0; off < 0x100; off++) {
hires1.write(page, off, off);
}
}
checkImageData(hires1);
});
});
describe('double lores', () => {
it('renders', () => {
vm.text(false);
vm._80col(true);
vm.an3(false);
const bank0 = hires1.bank0();
const bank1 = hires1.bank1();
for (let page = 0x20; page < 0x40; page++) {
for (let off = 0; off < 0x100; off++) {
bank0.write(page, off, off);
bank1.write(page, off, 255 - off);
}
}
checkImageData(hires1);
});
});
});
});