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;
 | |
| }
 |