const std = @import("std");
const vmm = @import("vmm_mock.zig");
const arch = @import("arch_mock.zig");
const Allocator = std.mem.Allocator;

const mock_framework = @import("mock_framework.zig");
pub const initTest = mock_framework.initTest;
pub const freeTest = mock_framework.freeTest;
pub const addTestParams = mock_framework.addTestParams;
pub const addConsumeFunction = mock_framework.addConsumeFunction;
pub const addRepeatFunction = mock_framework.addRepeatFunction;

pub const EntryPoint = usize;

pub const Task = struct {
    const Self = @This();

    pid: u32,
    kernel_stack: []u32,
    user_stack: []u32,
    stack_pointer: usize,
    kernel: bool,
    vmm: vmm.VirtualMemoryManager(arch.VmmPayload),

    pub fn create(entry_point: EntryPoint, kernel: bool, task_vmm: *vmm.VirtualMemoryManager(arch.VmmPayload), allocator: *Allocator) Allocator.Error!*Task {
        return mock_framework.performAction("Task.create", Allocator.Error!*Task, .{ entry_point, allocator, kernel, task_vmm });
    }

    pub fn destroy(self: *Self, allocator: *Allocator) void {
        return mock_framework.performAction("Task.destroy", void, .{ self, allocator });
    }
};