72 lines
2.4 KiB
JavaScript
72 lines
2.4 KiB
JavaScript
const MINIMUM_BASE_AREA = 0.5;
|
|
const MINIMUM_AREA_THREE_RATS = 1.8;
|
|
const AREA_PER_ADDITIONAL_RAT = 0.2;
|
|
const MAXIMUM_FALL_HEIGHT = 0.5;
|
|
const MINIMUM_LENGTH = 0.8;
|
|
|
|
const FAILED_BASE_AREA = "base_area";
|
|
const FAILED_OVERALL_AREA = "overall_area";
|
|
const FAILED_FALL_HEIGHT = "fall_height";
|
|
const FAILED_NUM_RATS = "num_rats";
|
|
const FAILED_LENGTH = "length";
|
|
|
|
const FAIL_CRITERIA = {
|
|
[FAILED_BASE_AREA]: `Die Mindestgrundfläche des Käfigs muss ${MINIMUM_BASE_AREA}m² (also z.B. 100x50cm) betragen.`,
|
|
[FAILED_OVERALL_AREA]: "Die Gesamtfläche im Käfig ist zu klein.",
|
|
[FAILED_FALL_HEIGHT]: `Die mögliche Fallhöhe darf nicht mehr als ${(MAXIMUM_FALL_HEIGHT * 100).toFixed(3)}cm betragen.`,
|
|
[FAILED_NUM_RATS]: "Es müssen mindestens 3 Ratten zusammenleben, Paarhaltung ist nicht artgerecht.",
|
|
[FAILED_LENGTH]: `Eine Seite des Käfig muss mindestens ${(MINIMUM_LENGTH * 100).toFixed(3)}cm lang sein um Rennen zu ermöglichen.`,
|
|
};
|
|
|
|
class Dimensions {
|
|
constructor(width, depth, height) {
|
|
this.width = width;
|
|
this.depth = depth;
|
|
this.height = height;
|
|
}
|
|
|
|
toString() {
|
|
return `${this.width}x${this.depth}x${this.height}`;
|
|
}
|
|
|
|
static fromDict(data) {
|
|
const { width, depth, height } = data;
|
|
return new Dimensions(width, depth, height);
|
|
}
|
|
}
|
|
|
|
function overallAreaNeeded(numOfRats) {
|
|
if (numOfRats < 3 || numOfRats > 15) {
|
|
throw new Error("This formula works only from 3 to 15 rats");
|
|
}
|
|
return MINIMUM_AREA_THREE_RATS + (numOfRats - 3) * AREA_PER_ADDITIONAL_RAT;
|
|
}
|
|
|
|
function cageCheck(dimensions, numRats, numFullFloors) {
|
|
let failedCriteria = {};
|
|
|
|
if (numRats < 2 || numRats > 15) {
|
|
failedCriteria[FAILED_NUM_RATS] = FAIL_CRITERIA[FAILED_NUM_RATS];
|
|
}
|
|
|
|
const baseArea = dimensions.depth * dimensions.width;
|
|
if (baseArea < MINIMUM_BASE_AREA) {
|
|
failedCriteria[FAILED_BASE_AREA] = FAIL_CRITERIA[FAILED_BASE_AREA];
|
|
}
|
|
|
|
const areaNeeded = overallAreaNeeded(numRats);
|
|
if (baseArea * numFullFloors < areaNeeded) {
|
|
failedCriteria[FAILED_OVERALL_AREA] = FAIL_CRITERIA[FAILED_OVERALL_AREA];
|
|
}
|
|
|
|
if (dimensions.height / numFullFloors > MAXIMUM_FALL_HEIGHT) {
|
|
failedCriteria[FAILED_FALL_HEIGHT] = FAIL_CRITERIA[FAILED_FALL_HEIGHT];
|
|
}
|
|
|
|
if (dimensions.width < MINIMUM_LENGTH && dimensions.depth < MINIMUM_LENGTH) {
|
|
failedCriteria[FAILED_LENGTH] = FAIL_CRITERIA[FAILED_LENGTH];
|
|
}
|
|
|
|
return failedCriteria;
|
|
}
|