Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ module.exports = {
"^src(.*)$": "<rootDir>/src$1",
"^test(.*)$": "<rootDir>/test$1",
webr: require.resolve("webr"),
"^d3-random$": "<rootDir>/test/__mocks__/d3-random.js",
},
transform: {
"^.+.tsx?$": ["ts-jest", {}],
"^.+\\.tsx?$": ["ts-jest", {}],
},
testEnvironment: "./jest.environment.js",
transformIgnorePatterns: ["/node_modules/(?!(webr))/"],
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "task_intentions",
"version": "1.7.3",
"version": "1.7.9",
"description": "Intentions Game",
"private": true,
"main": "dist/index.js",
Expand Down
3 changes: 1 addition & 2 deletions src/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,7 @@ experiment.getState().set("experimentID", experimentID);
initializeLocalStorage(experimentID);

// Generate status values for participant and partner during actual trials
const { partnerStatus: partnerLowStatus, participantStatus: participantDefaultStatus } = generateStatuses(false);
const { partnerStatus: partnerHighStatus } = generateStatuses(true);
const { participantStatus: participantDefaultStatus, partnerLowStatus, partnerHighStatus } = generateStatuses();

// Store status values in the experiment state
experiment.getState().set("participantDefaultStatus", participantDefaultStatus);
Expand Down
34 changes: 17 additions & 17 deletions src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ import FileSaver from "file-saver";
// Logging
import consola from "consola";

// Random number generation
import { randomUniform } from "d3-random";

// Experiment configuration
import { Configuration } from "./configuration";

Expand Down Expand Up @@ -250,26 +253,23 @@ export const generatePartnerID = (): string => {
};

/**
* Generate the participant and partner statuses
* @param partnerHighStatus whether the partner is in high status
* @returns
* Generate the participant and partner statuses using uniform distributions
* @returns Object containing participant status (40-60%), partner low status (10-25%), and partner high status (75-90%)
*/
export const generateStatuses = (partnerHighStatus: boolean): { participantStatus: number, partnerStatus: number } => {
// Access `experiment` instance to generate random numbers
const experiment = window.Experiment;

// Generate the participant status
const participantVariance = experiment.random() * Configuration.statusDisplay.participantRange * experiment.random() > 0.5 ? 1 : -1;
const participantStatus = Configuration.statusDisplay.participantDefault + participantVariance;
export const generateStatuses = (): { participantStatus: number, partnerLowStatus: number, partnerHighStatus: number } => {
// Create uniform distribution generators
const participantRandom = randomUniform(40, 60);
const partnerLowRandom = randomUniform(10, 25);
const partnerHighRandom = randomUniform(75, 90);

// Generate the partner status
let partnerStatus = partnerHighStatus ? Configuration.statusDisplay.partnerHigh : Configuration.statusDisplay.partnerLow;
const partnerVariance = experiment.random() * Configuration.statusDisplay.partnerRange * experiment.random() > 0.5 ? 1 : -1;
partnerStatus += partnerVariance;
// Generate the statuses using uniform distributions
const participantStatus = Math.round(participantRandom() * 10) / 10; // Round to 1 decimal place
const partnerLowStatus = Math.round(partnerLowRandom() * 10) / 10;
const partnerHighStatus = Math.round(partnerHighRandom() * 10) / 10;

// Log the statuses
consola.info(`Participant status: ${participantStatus}, Partner status (${partnerHighStatus ? "high" : "low"}): ${partnerStatus}`);
consola.info(`Generated statuses - Participant: ${participantStatus}%, Partner Low: ${partnerLowStatus}%, Partner High: ${partnerHighStatus}%`);

// Return the statuses
return { participantStatus, partnerStatus };
// Return all three statuses
return { participantStatus, partnerLowStatus, partnerHighStatus };
};
20 changes: 20 additions & 0 deletions test/__mocks__/d3-random.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/**
* Mock for d3-random library for Jest tests
* Provides deterministic random number generation for testing
*/

// Mock randomUniform function that returns a generator function
const mockRandomUniform = (min, max) => {
// Return a function that generates deterministic values for testing
let callCount = 0;
return () => {
callCount++;
// Generate deterministic values based on call count for consistent testing
const seed = (callCount * 0.1) % 1;
return min + (max - min) * seed;
};
};

module.exports = {
randomUniform: mockRandomUniform,
};