294 lines
9.1 KiB
Zig
294 lines
9.1 KiB
Zig
|
const vga = @import("../../../src/kernel/vga.zig");
|
||
|
const arch = @import("../../../src/kernel/arch.zig").internals;
|
||
|
|
||
|
const expectEqual = @import("std").testing.expectEqual;
|
||
|
|
||
|
test "entryColour" {
|
||
|
var fg: u4 = vga.COLOUR_BLACK;
|
||
|
var bg: u4 = vga.COLOUR_BLACK;
|
||
|
var res: u8 = vga.entryColour(fg, bg);
|
||
|
expectEqual(u8(0x00), res);
|
||
|
|
||
|
fg = vga.COLOUR_LIGHT_GREEN;
|
||
|
bg = vga.COLOUR_BLACK;
|
||
|
res = vga.entryColour(fg, bg);
|
||
|
expectEqual(u8(0x0A), res);
|
||
|
|
||
|
fg = vga.COLOUR_BLACK;
|
||
|
bg = vga.COLOUR_LIGHT_GREEN;
|
||
|
res = vga.entryColour(fg, bg);
|
||
|
expectEqual(u8(0xA0), res);
|
||
|
|
||
|
fg = vga.COLOUR_BROWN;
|
||
|
bg = vga.COLOUR_LIGHT_GREEN;
|
||
|
res = vga.entryColour(fg, bg);
|
||
|
expectEqual(u8(0xA6), res);
|
||
|
}
|
||
|
|
||
|
test "entry" {
|
||
|
var colour: u8 = vga.entryColour(vga.COLOUR_BROWN, vga.COLOUR_LIGHT_GREEN);
|
||
|
expectEqual(u8(0xA6), colour);
|
||
|
|
||
|
// Character '0' is 0x30
|
||
|
var video_entry: u16 = vga.entry('0', colour);
|
||
|
expectEqual(u16(0xA630), video_entry);
|
||
|
|
||
|
video_entry = vga.entry(0x55, colour);
|
||
|
expectEqual(u16(0xA655), video_entry);
|
||
|
}
|
||
|
|
||
|
test "updateCursor width out of bounds" {
|
||
|
const x: u16 = vga.WIDTH;
|
||
|
const y: u16 = 0;
|
||
|
|
||
|
const max_cursor: u16 = (vga.HEIGHT - 1) * vga.WIDTH + (vga.WIDTH - 1);
|
||
|
const expected_upper: u8 = @truncate(u8, (max_cursor >> 8) & 0x00FF);
|
||
|
const expected_lower: u8 = @truncate(u8, max_cursor & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "updateCursor height out of bounds" {
|
||
|
const x: u16 = 0;
|
||
|
const y: u16 = vga.HEIGHT;
|
||
|
|
||
|
const max_cursor: u16 = (vga.HEIGHT - 1) * vga.WIDTH + (vga.WIDTH - 1);
|
||
|
const expected_upper: u8 = @truncate(u8, (max_cursor >> 8) & 0x00FF);
|
||
|
const expected_lower: u8 = @truncate(u8, max_cursor & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "updateCursor width and height out of bounds" {
|
||
|
const x: u16 = vga.WIDTH;
|
||
|
const y: u16 = vga.HEIGHT;
|
||
|
|
||
|
const max_cursor: u16 = (vga.HEIGHT - 1) * vga.WIDTH + (vga.WIDTH - 1);
|
||
|
const expected_upper: u8 = @truncate(u8, (max_cursor >> 8) & 0x00FF);
|
||
|
const expected_lower: u8 = @truncate(u8, max_cursor & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "updateCursor width-1 and height out of bounds" {
|
||
|
const x: u16 = vga.WIDTH - 1;
|
||
|
const y: u16 = vga.HEIGHT;
|
||
|
|
||
|
const max_cursor: u16 = (vga.HEIGHT - 1) * vga.WIDTH + (vga.WIDTH - 1);
|
||
|
const expected_upper: u8 = @truncate(u8, (max_cursor >> 8) & 0x00FF);
|
||
|
const expected_lower: u8 = @truncate(u8, max_cursor & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "updateCursor width and height-1 out of bounds" {
|
||
|
const x: u16 = vga.WIDTH;
|
||
|
const y: u16 = vga.HEIGHT - 1;
|
||
|
|
||
|
const max_cursor: u16 = (vga.HEIGHT - 1) * vga.WIDTH + (vga.WIDTH - 1);
|
||
|
const expected_upper: u8 = @truncate(u8, (max_cursor >> 8) & 0x00FF);
|
||
|
const expected_lower: u8 = @truncate(u8, max_cursor & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "updateCursor in bounds" {
|
||
|
var x: u16 = 0x000A;
|
||
|
var y: u16 = 0x000A;
|
||
|
const expected: u16 = y * vga.WIDTH + x;
|
||
|
|
||
|
var expected_upper: u8 = @truncate(u8, (expected >> 8) & 0x00FF);
|
||
|
var expected_lower: u8 = @truncate(u8, expected & 0x00FF);
|
||
|
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for changing the hardware cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW,
|
||
|
vga.PORT_DATA, expected_lower,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH,
|
||
|
vga.PORT_DATA, expected_upper);
|
||
|
vga.updateCursor(x, y);
|
||
|
}
|
||
|
|
||
|
test "getCursor 1: 10" {
|
||
|
const expect: u16 = u16(10);
|
||
|
|
||
|
// Mocking out the arch.outb and arch.inb calls for getting the hardware cursor:
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW);
|
||
|
|
||
|
arch.addTestParams("inb",
|
||
|
vga.PORT_DATA, u8(10));
|
||
|
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH);
|
||
|
|
||
|
arch.addTestParams("inb",
|
||
|
vga.PORT_DATA, u8(0));
|
||
|
|
||
|
const actual: u16 = vga.getCursor();
|
||
|
expectEqual(expect, actual);
|
||
|
}
|
||
|
|
||
|
test "getCursor 2: 0xBEEF" {
|
||
|
const expect: u16 = u16(0xBEEF);
|
||
|
|
||
|
// Mocking out the arch.outb and arch.inb calls for getting the hardware cursor:
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_LOW);
|
||
|
|
||
|
arch.addTestParams("inb",
|
||
|
vga.PORT_DATA, u8(0xEF));
|
||
|
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_LOCATION_HIGH);
|
||
|
|
||
|
arch.addTestParams("inb",
|
||
|
vga.PORT_DATA, u8(0xBE));
|
||
|
|
||
|
const actual: u16 = vga.getCursor();
|
||
|
expectEqual(expect, actual);
|
||
|
}
|
||
|
|
||
|
test "enableCursor all" {
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Need to init the cursor start and end positions, so call the vga.init() to set this up
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_MAXIMUM_SCAN_LINE,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_MIDDLE,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_END,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END,
|
||
|
// Mocking out the arch.outb calls for enabling the cursor:
|
||
|
// These are the default cursor positions from vga.init()
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_MIDDLE,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_END,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END);
|
||
|
|
||
|
vga.init();
|
||
|
vga.enableCursor();
|
||
|
}
|
||
|
|
||
|
test "disableCursor all" {
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for disabling the cursor:
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_DISABLE);
|
||
|
vga.disableCursor();
|
||
|
}
|
||
|
|
||
|
test "setCursorShape UNDERLINE" {
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for setting the cursor shape to underline:
|
||
|
// This will also check that the scan line variables were set properly as these are using in
|
||
|
// the arch.outb call
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_MIDDLE,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_END,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END);
|
||
|
|
||
|
vga.setCursorShape(vga.CursorShape.UNDERLINE);
|
||
|
}
|
||
|
|
||
|
test "setCursorShape BLOCK" {
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for setting the cursor shape to block:
|
||
|
// This will also check that the scan line variables were set properly as these are using in
|
||
|
// the arch.outb call
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_START,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_END,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END);
|
||
|
|
||
|
vga.setCursorShape(vga.CursorShape.BLOCK);
|
||
|
}
|
||
|
|
||
|
test "init all" {
|
||
|
arch.initTest();
|
||
|
defer arch.freeTest();
|
||
|
|
||
|
// Mocking out the arch.outb calls for setting the cursor max scan line and the shape to block:
|
||
|
// This will also check that the scan line variables were set properly as these are using in
|
||
|
// the arch.outb call for setting the cursor shape.
|
||
|
arch.addTestParams("outb",
|
||
|
vga.PORT_ADDRESS, vga.REG_MAXIMUM_SCAN_LINE,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_START,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_MIDDLE,
|
||
|
vga.PORT_ADDRESS, vga.REG_CURSOR_END,
|
||
|
vga.PORT_DATA, vga.CURSOR_SCANLINE_END);
|
||
|
|
||
|
vga.init();
|
||
|
}
|