dao-governance-framework/forum-network/src/tests/availability.html

157 lines
4.1 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<head>
<title>Availability test</title>
<link type="text/css" rel="stylesheet" href="/index.css" />
</head>
<body>
<div id="availability-test"></div>
</body>
<script type="module">
import { Box } from "/classes/box.js";
import { Scene } from "/classes/scene.js";
2023-01-03 12:00:12 -06:00
import { Expert } from "/classes/expert.js";
import { Bench } from "/classes/bench.js";
import { Business } from "/classes/business.js";
import { Availability } from "/classes/availability.js";
import { delay } from "/util.js";
import { Forum } from "/classes/forum.js";
import { Public } from "/classes/public.js";
const DELAY_INTERVAL = 500;
const rootElement = document.getElementById("availability-test");
const rootBox = new Box("rootBox", rootElement).flex();
2023-01-08 20:19:33 -06:00
const scene = (window.scene = new Scene("Availability test", rootBox));
scene.withSequenceDiagram();
const experts = (window.experts = []);
2023-01-03 12:00:12 -06:00
const newExpert = async () => {
const index = experts.length;
2023-01-03 12:00:12 -06:00
const name = `Expert${index + 1}`;
const expert = await new Expert(name, scene).initialize();
experts.push(expert);
return expert;
};
const expert1 = await newExpert();
const expert2 = await newExpert();
2023-01-03 12:00:12 -06:00
await newExpert();
2023-01-04 16:28:36 -06:00
const forum = (window.forum = new Forum("Forum", scene));
const bench = (window.bench = new Bench(forum, "Bench", scene));
const availability = (window.bench = new Availability(
bench,
"Availability",
scene
));
const business = (window.business = new Business(
bench,
forum,
availability,
"Business",
scene
));
const requestor = new Public("Public", scene);
const updateDisplayValues = async () => {
for (const expert of experts) {
await expert.setValue(
"rep",
bench.reputations.getTokens(expert.reputationPublicKey)
);
}
await bench.setValue("total rep", bench.getTotalReputation());
await scene.sequence.render();
};
const updateDisplayValuesAndDelay = async () => {
await updateDisplayValues();
await delay(DELAY_INTERVAL);
};
const getActiveWorker = async () => {
let worker;
let request;
for (const expert of experts) {
request = await expert.getAssignedWork(availability, business);
if (request) {
worker = expert;
await worker.actions.getAssignedWork.log(worker, availability);
worker.activate();
break;
}
}
return { worker, request };
};
const voteForWorkEvidence = async (worker, pool) => {
for (const expert of experts) {
if (expert !== worker) {
await expert.castVote(pool, {
position: true,
stake: 1,
anonymous: false,
});
}
}
};
await updateDisplayValuesAndDelay();
// Populate availability pool
await expert1.registerAvailability(availability, 1);
await expert2.registerAvailability(availability, 1);
await updateDisplayValuesAndDelay();
// Submit work request
await requestor.submitRequest(
business,
{ fee: 100 },
{ please: "do some work" }
);
await updateDisplayValuesAndDelay();
// Receive work request
const { worker, request } = await getActiveWorker();
// Submit work evidence
const pool = await worker.submitWork(
business,
request.id,
{
here: "is some evidence of work product",
},
{
tokenLossRatio: 1,
duration: 1000,
}
);
worker.deactivate();
await updateDisplayValuesAndDelay();
// Vote on work evidence
await voteForWorkEvidence(worker, pool);
await updateDisplayValuesAndDelay();
// Wait for validation pool duration to elapse
await delay(1000);
// Distribute reputation awards and fees
await pool.evaluateWinningConditions();
await updateDisplayValuesAndDelay();
// This should throw an exception since the pool is already resolved
try {
await pool.evaluateWinningConditions();
} catch (e) {
if (e.message.match(/Validation pool has already been resolved/)) {
console.log(
"Caught expected error: Validation pool has already been resolved"
);
} else {
console.error("Unexpected error");
throw e;
}
}
</script>