mirror of
https://github.com/AlecM33/Werewolf.git
synced 2025-12-26 15:57:50 +01:00
@@ -24,9 +24,11 @@ const port = Array
|
||||
app.set("port", port);
|
||||
|
||||
app.use(express.static(__dirname));
|
||||
app.use(express.static(path.join(__dirname, 'assets')));
|
||||
app.use(express.static(path.join(__dirname, 'static')));
|
||||
app.use(express.static(path.join(__dirname, 'images')));
|
||||
app.use(express.static(path.join(__dirname, 'fonts')));
|
||||
app.use(express.static(path.join(__dirname, 'views')));
|
||||
app.use(express.static(path.join(__dirname, 'scripts')));
|
||||
app.use(express.static(path.join(__dirname, 'stylesheets')));
|
||||
app.use(express.static(path.join(__dirname, 'spec')));
|
||||
|
||||
app.get("/tests",function(request, response){
|
||||
@@ -65,4 +67,4 @@ if(openBrowser) {
|
||||
} else {
|
||||
open("http://localhost:" + port + "/tests");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,8 @@
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"start": "node server.js",
|
||||
"test": "jasmine && node browsertest.js openBrowser socket",
|
||||
"test:unit": "jasmine",
|
||||
"test:e2e": "node browsertest.js"
|
||||
"test": "jasmine",
|
||||
"test:all": "jasmine && node browsertest.js openBrowser socket"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
|
||||
@@ -5,7 +5,7 @@ const socketIO = require('socket.io');
|
||||
const app = express();
|
||||
const server = http.Server(app);
|
||||
const io = socketIO(server);
|
||||
const ServerHelper = require('./server-helper');
|
||||
const ServerHelper = require('server-helper.js');
|
||||
const secure = require('express-force-https');
|
||||
app.use(secure);
|
||||
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
let socket;
|
||||
|
||||
// Jasmine lifecycle hooks
|
||||
|
||||
beforeEach(() => {
|
||||
cleanupPlayground();
|
||||
// jasmine.addMatchers({ /* provide matcher function here if you want to, I guess */});
|
||||
});
|
||||
|
||||
beforeAll(() => {
|
||||
if(window.location.search.includes("socket=true")) {
|
||||
socket = io();
|
||||
}
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
/*
|
||||
if(socket !== undefined) {
|
||||
socket.emit("test result",parseTestResults());
|
||||
}
|
||||
|
||||
How to get only the newest result? No clue right now.
|
||||
|
||||
*/
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
resportResultsOnSocket();
|
||||
});
|
||||
|
||||
|
||||
// Utility functions
|
||||
|
||||
const parseTestResults = function() {
|
||||
const resultsElement = document.querySelector("span.jasmine-overall-result.jasmine-bar");
|
||||
|
||||
if(resultsElement !== null) {
|
||||
const results = /.*(\d+) specs.*(\d+) failure.*(\d+).*/.exec(resultsElement.textContent);
|
||||
const total = parseInt(results[1]);
|
||||
const failures = parseInt(results[2]);
|
||||
const pending = parseInt(results[3]);
|
||||
return Promise.resolve({
|
||||
"totalCount": total,
|
||||
"failureCount": failures,
|
||||
"pendingCount": pending
|
||||
});
|
||||
} else {
|
||||
let maxRetries = 60;
|
||||
return new Promise((resolve, reject) => {
|
||||
const resultsInterval = setInterval(() => {
|
||||
maxRetries--;
|
||||
const resultsElem = document.querySelector("span.jasmine-overall-result.jasmine-bar");
|
||||
|
||||
if (maxRetries === 0) {
|
||||
reject("Required results element not found.");
|
||||
} else {
|
||||
if (resultsElem !== null) {
|
||||
const results = /.*(\d+) spec.*(\d+) failure.*(\d+).*/.exec(resultsElem.textContent);
|
||||
const pendingResults = /.*(\d+) pending.*/.exec(resultsElem.textContent);
|
||||
const total = parseInt(results[1]);
|
||||
const failures = parseInt(results[2]);
|
||||
const pending = pendingResults ? parseInt(pendingResults[1]) : 0;
|
||||
clearInterval(resultsInterval);
|
||||
resolve({
|
||||
"totalCount": total,
|
||||
"failureCount": failures,
|
||||
"pendingCount": pending
|
||||
});
|
||||
}
|
||||
}
|
||||
}, 500);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
export const addStubElement = function(element) {
|
||||
document.getElementById("playground").appendChild(element);
|
||||
};
|
||||
|
||||
export const cleanupPlayground = function() {
|
||||
document.getElementById("playground").innerHTML = "";
|
||||
};
|
||||
|
||||
export const resportResultsOnSocket = function() {
|
||||
|
||||
if(socket === undefined) {
|
||||
socket = io();
|
||||
}
|
||||
|
||||
parseTestResults().then((results) => {
|
||||
socket.emit("all-results",results);
|
||||
}).catch((e) => {console.error(e);});
|
||||
};
|
||||
@@ -1,37 +0,0 @@
|
||||
import { addStubElement } from "../SpecHelper.js"
|
||||
import { setup } from "../../static/setup.js"
|
||||
|
||||
describe("Home page", function() {
|
||||
|
||||
beforeEach(function() {
|
||||
|
||||
});
|
||||
|
||||
it("should render the set of standard and custom roles", function() {
|
||||
|
||||
// arrange
|
||||
let goodCards = document.createElement("div");
|
||||
goodCards.setAttribute("id", "card-select-good");
|
||||
|
||||
let evilCards = document.createElement("div");
|
||||
evilCards.setAttribute("id", "card-select-evil");
|
||||
|
||||
let roles = document.createElement("div");
|
||||
roles.setAttribute("id", "roles");
|
||||
|
||||
let customRoles = document.createElement("div");
|
||||
customRoles.setAttribute("id", "custom-roles");
|
||||
|
||||
addStubElement(goodCards);
|
||||
addStubElement(evilCards);
|
||||
addStubElement(roles);
|
||||
addStubElement(customRoles);
|
||||
|
||||
// act
|
||||
setup.renderAvailableCards(false);
|
||||
|
||||
//assert
|
||||
expect(document.getElementById("card-0")).toBeDefined();
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"spec_dir": "spec/unit/",
|
||||
"spec_dir": "spec/unit",
|
||||
"spec_files": [
|
||||
"**/*[sS]pec.js"
|
||||
],
|
||||
@@ -8,4 +8,4 @@
|
||||
],
|
||||
"stopSpecOnExpectationFailure": false,
|
||||
"random": true
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
module.exports = function(debugMode = false){
|
||||
return {
|
||||
log(message = "") {
|
||||
const now = new Date();
|
||||
console.log('LOG ', now.toGMTString(), ': ', message);
|
||||
},
|
||||
|
||||
debug(message = "") {
|
||||
if (!debugMode) return;
|
||||
const now = new Date();
|
||||
console.debug('DEBUG ', now.toGMTString(), ': ', message);
|
||||
},
|
||||
|
||||
error(message = "") {
|
||||
if (!debugMode) return;
|
||||
const now = new Date();
|
||||
console.error('ERROR ', now.toGMTString(), ': ', message);
|
||||
}
|
||||
};
|
||||
};
|
||||
111
static/setup.js
111
static/setup.js
@@ -21,64 +21,57 @@ const fullDeck = [];
|
||||
let gameSize = 0;
|
||||
let atLeastOnePlayer = false;
|
||||
|
||||
export class Setup {
|
||||
constructor() {
|
||||
// render all of the available cards to the user
|
||||
window.onload = function() {
|
||||
// register event listeners on buttons
|
||||
document.getElementById("reset-btn").addEventListener("click", resetCardQuantities);
|
||||
document.getElementById("create-btn").addEventListener("click", createGame);
|
||||
document.getElementById("role-view-changer-gallery").addEventListener("click", function() { toggleViewChanger(false) });
|
||||
document.getElementById("role-view-changer-list").addEventListener("click", function() { toggleViewChanger(true) });
|
||||
document.getElementById("role-btn").addEventListener("click", function() { displayModal("role-modal", undefined) });
|
||||
document.getElementById("edit-role-btn").addEventListener("click", function() { displayModal("edit-custom-roles-modal", undefined) });
|
||||
document.getElementById("custom-role-form").addEventListener("submit", function(e) {
|
||||
addCustomCardToRoles(e);
|
||||
});
|
||||
Array.from(document.getElementsByClassName("close")).forEach(function(element) {
|
||||
element.addEventListener('click', closeModal);
|
||||
});
|
||||
// register event listeners on buttons
|
||||
document.getElementById("reset-btn").addEventListener("click", resetCardQuantities);
|
||||
document.getElementById("create-btn").addEventListener("click", createGame);
|
||||
document.getElementById("role-view-changer-gallery").addEventListener("click", function() { toggleViewChanger(false) });
|
||||
document.getElementById("role-view-changer-list").addEventListener("click", function() { toggleViewChanger(true) });
|
||||
document.getElementById("role-btn").addEventListener("click", function() { displayModal("role-modal", undefined) });
|
||||
document.getElementById("edit-role-btn").addEventListener("click", function() { displayModal("edit-custom-roles-modal", undefined) });
|
||||
document.getElementById("custom-role-form").addEventListener("submit", function(e) {
|
||||
addCustomCardToRoles(e);
|
||||
});
|
||||
Array.from(document.getElementsByClassName("close")).forEach(function(element) {
|
||||
element.addEventListener('click', closeModal);
|
||||
});
|
||||
|
||||
readInUserCustomRoles();
|
||||
setup.renderAvailableCards(false);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export const setup = {
|
||||
|
||||
renderAvailableCards(isCondensed) {
|
||||
cards.sort(function(a, b) {
|
||||
return a.role.toUpperCase().localeCompare(b.role);
|
||||
});
|
||||
document.getElementById("card-select-good").innerHTML = "";
|
||||
document.getElementById("card-select-evil").innerHTML = "";
|
||||
document.getElementById("roles").innerHTML = "";
|
||||
document.getElementById("custom-roles").innerHTML = "";
|
||||
|
||||
for (let i = 0; i < cards.length; i ++) {
|
||||
cards[i].team === "good"
|
||||
? renderGoodRole(cards[i], i, isCondensed)
|
||||
: renderEvilRole(cards[i], i, isCondensed);
|
||||
}
|
||||
|
||||
if (document.getElementById("custom-roles").getElementsByClassName("custom-role-edit").length === 0) {
|
||||
document.getElementById("custom-roles").innerHTML = "<h2>You haven't added any custom cards.</h2>";
|
||||
}
|
||||
|
||||
let customCardGood = CardManager.constructCustomCardIndicator(isCondensed, "good");
|
||||
let customCardEvil = CardManager.constructCustomCardIndicator(isCondensed, "evil");
|
||||
document.getElementById("card-select-good").appendChild(customCardGood);
|
||||
document.getElementById("card-select-evil").appendChild(customCardEvil);
|
||||
customCardGood.addEventListener("click", function() {
|
||||
displayModal("custom-card-modal", "Good");
|
||||
});
|
||||
customCardEvil.addEventListener("click", function() {
|
||||
displayModal("custom-card-modal", "Evil");
|
||||
});
|
||||
}
|
||||
// render all of the available cards to the user
|
||||
window.onload = function() {
|
||||
readInUserCustomRoles();
|
||||
renderAvailableCards(false);
|
||||
};
|
||||
|
||||
function renderAvailableCards(isCondensed) {
|
||||
cards.sort(function(a, b) {
|
||||
return a.role.toUpperCase().localeCompare(b.role);
|
||||
});
|
||||
document.getElementById("card-select-good").innerHTML = "";
|
||||
document.getElementById("card-select-evil").innerHTML = "";
|
||||
document.getElementById("roles").innerHTML = "";
|
||||
document.getElementById("custom-roles").innerHTML = "";
|
||||
|
||||
for (let i = 0; i < cards.length; i ++) {
|
||||
cards[i].team === "good"
|
||||
? renderGoodRole(cards[i], i, isCondensed)
|
||||
: renderEvilRole(cards[i], i, isCondensed);
|
||||
}
|
||||
|
||||
if (document.getElementById("custom-roles").getElementsByClassName("custom-role-edit").length === 0) {
|
||||
document.getElementById("custom-roles").innerHTML = "<h2>You haven't added any custom cards.</h2>";
|
||||
}
|
||||
|
||||
let customCardGood = CardManager.constructCustomCardIndicator(isCondensed, "good");
|
||||
let customCardEvil = CardManager.constructCustomCardIndicator(isCondensed, "evil");
|
||||
document.getElementById("card-select-good").appendChild(customCardGood);
|
||||
document.getElementById("card-select-evil").appendChild(customCardEvil);
|
||||
customCardGood.addEventListener("click", function() {
|
||||
displayModal("custom-card-modal", "Good");
|
||||
});
|
||||
customCardEvil.addEventListener("click", function() {
|
||||
displayModal("custom-card-modal", "Evil");
|
||||
});
|
||||
}
|
||||
|
||||
function renderGoodRole(cardInfo, i, isCondensed) {
|
||||
const card = CardManager.createCard(cardInfo);
|
||||
if (card.custom) {
|
||||
@@ -159,7 +152,7 @@ function addCustomCardToRoles(e) {
|
||||
saved: document.getElementById("custom-role-remember").checked
|
||||
};
|
||||
cards.push(newCard);
|
||||
setup.renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
|
||||
if (newCard.saved === true) {
|
||||
let existingRoles = localStorage.getItem("play-werewolf-custom-roles");
|
||||
@@ -257,7 +250,7 @@ function toggleViewChanger(isCondensed) {
|
||||
document.getElementById("role-view-changer-gallery").classList.add("selected");
|
||||
document.getElementById("role-view-changer-list").classList.remove("selected");
|
||||
}
|
||||
setup.renderAvailableCards(isCondensed);
|
||||
renderAvailableCards(isCondensed);
|
||||
}
|
||||
|
||||
function buildRoleEditForm(index) {
|
||||
@@ -307,7 +300,7 @@ function removeCustomRole(name) {
|
||||
localStorage.setItem("play-werewolf-custom-roles", JSON.stringify(userCustomRoles));
|
||||
}
|
||||
updateCustomRoleModal();
|
||||
setup.renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -322,7 +315,7 @@ function updateCustomRole(event, index) {
|
||||
|
||||
removeOrAddSavedRoleIfNeeded(cardToUpdate);
|
||||
toggleEditForm(event, index);
|
||||
setup.renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
renderAvailableCards(document.getElementById("role-view-changer-list").classList.contains("selected"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
<!--<script src="../server-helper.js" type="module"></script>-->
|
||||
|
||||
<!-- include spec files here... -->
|
||||
<script src="../spec/SpecHelper.js" type="module"></script>
|
||||
<script src="../spec/e2e/SetupSpec.js" type="module"></script>
|
||||
<script src="/spec/SpecHelper.js" type="module"></script>
|
||||
<script src="/spec/HomeSpec.js" type="module"></script>
|
||||
<style>
|
||||
div#playground {
|
||||
visibility: hidden;
|
||||
|
||||
@@ -117,10 +117,6 @@
|
||||
<p id="some-error"></p>
|
||||
</div>
|
||||
</div>
|
||||
<script type="module" src="/static/setup.js"></script>
|
||||
<script type="module">
|
||||
import { Setup } from "/static/setup.js";
|
||||
const testSetup = new Setup();
|
||||
</script>
|
||||
<script type="module" src="/static/setup.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user