or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

assertions.mdcli.mdconfiguration.mderror-handling.mdevents.mdhooks.mdindex.mdtest-definition.mdtest-flavors.mdutilities.md

assertions.mddocs/

0

# Assertions

1

2

Comprehensive assertion library providing methods for validating test conditions, comparing values, testing exceptions, and controlling test flow.

3

4

## Capabilities

5

6

### Basic Truth Assertions

7

8

Fundamental assertions for testing boolean conditions.

9

10

```javascript { .api }

11

/**

12

* Assert that a value is truthy

13

* @param {any} result - Value to test

14

* @param {string} [message] - Optional assertion message

15

*/

16

assert.ok(result, message)

17

18

/**

19

* Assert that a value is falsy

20

* @param {any} result - Value to test

21

* @param {string} [message] - Optional assertion message

22

*/

23

assert.notOk(result, message)

24

25

/**

26

* Assert that a value is strictly true

27

* @param {any} result - Value to test

28

* @param {string} [message] - Optional assertion message

29

*/

30

assert.true(result, message)

31

32

/**

33

* Assert that a value is strictly false

34

* @param {any} result - Value to test

35

* @param {string} [message] - Optional assertion message

36

*/

37

assert.false(result, message)

38

```

39

40

**Usage Examples:**

41

42

```javascript

43

QUnit.test("truth assertions", function(assert) {

44

assert.ok(1, "1 is truthy");

45

assert.ok("hello", "non-empty string is truthy");

46

assert.notOk(0, "0 is falsy");

47

assert.notOk("", "empty string is falsy");

48

49

assert.true(true, "boolean true");

50

assert.false(false, "boolean false");

51

});

52

```

53

54

### Equality Assertions

55

56

Compare values using different equality semantics.

57

58

```javascript { .api }

59

/**

60

* Loose equality comparison using ==

61

* @param {any} actual - Actual value

62

* @param {any} expected - Expected value

63

* @param {string} [message] - Optional assertion message

64

*/

65

assert.equal(actual, expected, message)

66

67

/**

68

* Loose inequality comparison using !=

69

* @param {any} actual - Actual value

70

* @param {any} expected - Expected value

71

* @param {string} [message] - Optional assertion message

72

*/

73

assert.notEqual(actual, expected, message)

74

75

/**

76

* Strict equality comparison using ===

77

* @param {any} actual - Actual value

78

* @param {any} expected - Expected value

79

* @param {string} [message] - Optional assertion message

80

*/

81

assert.strictEqual(actual, expected, message)

82

83

/**

84

* Strict inequality comparison using !==

85

* @param {any} actual - Actual value

86

* @param {any} expected - Expected value

87

* @param {string} [message] - Optional assertion message

88

*/

89

assert.notStrictEqual(actual, expected, message)

90

91

/**

92

* Deep equality comparison (recursive)

93

* @param {any} actual - Actual value

94

* @param {any} expected - Expected value

95

* @param {string} [message] - Optional assertion message

96

*/

97

assert.deepEqual(actual, expected, message)

98

99

/**

100

* Deep inequality comparison (recursive)

101

* @param {any} actual - Actual value

102

* @param {any} expected - Expected value

103

* @param {string} [message] - Optional assertion message

104

*/

105

assert.notDeepEqual(actual, expected, message)

106

```

107

108

**Usage Examples:**

109

110

```javascript

111

QUnit.test("equality assertions", function(assert) {

112

assert.equal("1", 1, "loose equality allows type coercion");

113

assert.notEqual("1", 2, "loose inequality");

114

115

assert.strictEqual("hello", "hello", "strings are strictly equal");

116

assert.notStrictEqual("1", 1, "different types are not strictly equal");

117

118

assert.deepEqual([1, 2, 3], [1, 2, 3], "arrays with same content");

119

assert.deepEqual({a: 1, b: 2}, {a: 1, b: 2}, "objects with same properties");

120

assert.notDeepEqual([1, 2], [1, 2, 3], "arrays with different content");

121

});

122

```

123

124

### Property Assertions

125

126

Compare object properties and property subsets.

127

128

```javascript { .api }

129

/**

130

* Compare enumerable properties of objects

131

* @param {any} actual - Actual object

132

* @param {any} expected - Expected object

133

* @param {string} [message] - Optional assertion message

134

*/

135

assert.propEqual(actual, expected, message)

136

137

/**

138

* Assert enumerable properties are not equal

139

* @param {any} actual - Actual object

140

* @param {any} expected - Expected object

141

* @param {string} [message] - Optional assertion message

142

*/

143

assert.notPropEqual(actual, expected, message)

144

145

/**

146

* Assert that object contains expected properties (subset)

147

* @param {any} actual - Actual object

148

* @param {any} expected - Expected subset of properties

149

* @param {string} [message] - Optional assertion message

150

*/

151

assert.propContains(actual, expected, message)

152

153

/**

154

* Assert that object does not contain expected properties (subset)

155

* @param {any} actual - Actual object

156

* @param {any} expected - Properties that should not be present

157

* @param {string} [message] - Optional assertion message

158

*/

159

assert.notPropContains(actual, expected, message)

160

```

161

162

**Usage Examples:**

163

164

```javascript

165

QUnit.test("property assertions", function(assert) {

166

const user = { name: "Alice", age: 30, email: "alice@example.com" };

167

168

assert.propEqual(user, { name: "Alice", age: 30, email: "alice@example.com" });

169

assert.propContains(user, { name: "Alice", age: 30 });

170

assert.notPropContains(user, { role: "admin" });

171

});

172

```

173

174

### Exception Assertions

175

176

Test for expected exceptions and promise rejections.

177

178

```javascript { .api }

179

/**

180

* Assert that a function throws an exception

181

* @param {Function} block - Function that should throw

182

* @param {any} [expected] - Expected exception (optional)

183

* @param {string} [message] - Optional assertion message

184

*/

185

assert.throws(block, expected, message)

186

187

/**

188

* Alias for throws()

189

* @param {Function} block - Function that should throw

190

* @param {any} [expected] - Expected exception (optional)

191

* @param {string} [message] - Optional assertion message

192

*/

193

assert.raises(block, expected, message)

194

195

/**

196

* Assert that a promise rejects

197

* @param {Promise} promise - Promise that should reject

198

* @param {any} [expected] - Expected rejection value (optional)

199

* @param {string} [message] - Optional assertion message

200

* @returns {Promise<void>}

201

*/

202

assert.rejects(promise, expected, message)

203

```

204

205

**Usage Examples:**

206

207

```javascript

208

QUnit.test("exception assertions", function(assert) {

209

assert.throws(() => {

210

throw new Error("Something went wrong");

211

}, Error, "function throws Error");

212

213

assert.throws(() => {

214

JSON.parse("invalid json");

215

}, "JSON.parse throws on invalid input");

216

217

// Testing promise rejection

218

assert.rejects(

219

fetch("/nonexistent-endpoint"),

220

"fetch should reject for 404"

221

);

222

});

223

```

224

225

### Numeric Assertions

226

227

Assertions for numeric comparisons with tolerance.

228

229

```javascript { .api }

230

/**

231

* Assert that values are within specified delta

232

* @param {number} actual - Actual numeric value

233

* @param {number} expected - Expected numeric value

234

* @param {number} delta - Maximum allowed difference

235

* @param {string} [message] - Optional assertion message

236

*/

237

assert.closeTo(actual, expected, delta, message)

238

```

239

240

**Usage Examples:**

241

242

```javascript

243

QUnit.test("numeric assertions", function(assert) {

244

assert.closeTo(0.1 + 0.2, 0.3, 0.0001, "floating point addition");

245

assert.closeTo(Math.PI, 3.14159, 0.00001, "PI approximation");

246

});

247

```

248

249

### Test Flow Control

250

251

Control test execution flow and assertion counting.

252

253

```javascript { .api }

254

/**

255

* Set expected number of assertions for this test

256

* @param {number} [count] - Expected assertion count (returns current if omitted)

257

* @returns {number|void} Current expected count when called without arguments

258

*/

259

assert.expect(count)

260

261

/**

262

* Create async control for pausing test execution

263

* @param {number} [count=1] - Number of async calls expected

264

* @returns {Function} Function to call when async operation completes

265

*/

266

assert.async(count)

267

268

/**

269

* Set timeout for current test

270

* @param {number} duration - Timeout in milliseconds

271

*/

272

assert.timeout(duration)

273

```

274

275

**Usage Examples:**

276

277

```javascript

278

QUnit.test("async test", function(assert) {

279

assert.expect(2);

280

const done = assert.async();

281

282

setTimeout(() => {

283

assert.ok(true, "first assertion");

284

assert.ok(true, "second assertion");

285

done();

286

}, 100);

287

});

288

289

QUnit.test("long running test", function(assert) {

290

assert.timeout(5000); // 5 second timeout

291

292

const done = assert.async();

293

longRunningOperation(() => {

294

assert.ok(true, "operation completed");

295

done();

296

});

297

});

298

```

299

300

### Step Assertions

301

302

Record and verify step-by-step execution.

303

304

```javascript { .api }

305

/**

306

* Record a step in test execution

307

* @param {string} message - Step description

308

*/

309

assert.step(message)

310

311

/**

312

* Verify that recorded steps match expected sequence

313

* @param {string[]} steps - Array of expected step messages

314

* @param {string} [message] - Optional assertion message

315

*/

316

assert.verifySteps(steps, message)

317

```

318

319

**Usage Examples:**

320

321

```javascript

322

QUnit.test("step verification", function(assert) {

323

function processOrder(order) {

324

assert.step("validate order");

325

if (order.valid) {

326

assert.step("calculate total");

327

assert.step("charge payment");

328

assert.step("send confirmation");

329

}

330

}

331

332

processOrder({ valid: true, items: [...] });

333

334

assert.verifySteps([

335

"validate order",

336

"calculate total",

337

"charge payment",

338

"send confirmation"

339

], "order processing steps executed in correct order");

340

});

341

```

342

343

### Low-Level Assertion Control

344

345

Direct control over assertion results.

346

347

```javascript { .api }

348

/**

349

* Manually push assertion result

350

* @param {Object} resultInfo - Assertion result object

351

* @param {boolean} resultInfo.result - Whether assertion passed

352

* @param {any} [resultInfo.actual] - Actual value

353

* @param {any} [resultInfo.expected] - Expected value

354

* @param {string} [resultInfo.message] - Assertion message

355

* @param {boolean} [resultInfo.negative] - Whether this is a negative assertion

356

* @param {string} [resultInfo.source] - Error source information

357

*/

358

assert.pushResult(resultInfo)

359

360

/**

361

* Alias for pushResult (legacy)

362

* @param {boolean} result - Test result

363

* @param {any} actual - Actual value

364

* @param {any} expected - Expected value

365

* @param {string} message - Assertion message

366

* @param {boolean} [negative] - Whether this is a negative assertion

367

*/

368

assert.push(result, actual, expected, message, negative)

369

```

370

371

**Usage Examples:**

372

373

```javascript

374

QUnit.test("custom assertion", function(assert) {

375

function customAssertion(value, message) {

376

const result = value > 0 && value < 100;

377

assert.pushResult({

378

result: result,

379

actual: value,

380

expected: "number between 0 and 100",

381

message: message || "value is in valid range"

382

});

383

}

384

385

customAssertion(50, "50 is in range");

386

customAssertion(150, "150 is out of range"); // This will fail

387

});

388

```

389

390

## Types

391

392

The assertion result object used with `pushResult()` has the following structure:

393

394

```javascript { .api }

395

/**

396

* @typedef {Object} AssertionResult

397

* @property {boolean} result - Whether assertion passed

398

* @property {any} [actual] - Actual value

399

* @property {any} [expected] - Expected value

400

* @property {string} [message] - Assertion message

401

* @property {string} [source] - Error details if assertion failed

402

* @property {boolean} [negative] - Whether this is a negative assertion

403

*/

404

405

/**

406

* The assert object contains all assertion methods and is passed

407

* as the first parameter to test callbacks.

408

* @typedef {Object} Assert

409

* @property {Object} test - Current test context

410

*/

411

```