# How to use substract64 method in fast-check-monorepo

Best JavaScript code snippet using fast-check-monorepo

math.ts

Source:math.ts

`...171 * Substract two ArrayInt64172 * @returns When result is zero always with sign=1173 * @internal174 */175export function substract64(arrayIntA: ArrayInt64, arrayIntB: ArrayInt64): ArrayInt64 {176 if (isStrictlySmaller64(arrayIntA, arrayIntB)) {177 const out = substract64Internal(arrayIntB, arrayIntA)178 out.sign = -1179 return out180 }181 return substract64Internal(arrayIntA, arrayIntB)182}183/**184 * Negative version of an ArrayInt64185 * @internal186 */187export function negative64(arrayIntA: ArrayInt64): ArrayInt64 {188 return {189 sign: -arrayIntA.sign as -1 | 1,190 data: [arrayIntA.data[0], arrayIntA.data[1]]191 }192}193/**194 * Add two ArrayInt64195 * @returns When result is zero always with sign=1196 * @internal197 */198export function add64(arrayIntA: ArrayInt64, arrayIntB: ArrayInt64): ArrayInt64 {199 if (isZero64(arrayIntB)) {200 if (isZero64(arrayIntA)) {201 return clone64(Zero64)202 }203 return clone64(arrayIntA)204 }205 return substract64(arrayIntA, negative64(arrayIntB))206}207/**208 * Halve an ArrayInt64209 * @internal210 */211export function halve64(a: ArrayInt64): ArrayInt64 {212 return {213 sign: a.sign,214 data: [Math.floor(a.data[0] / 2), (a.data[0] % 2 === 1 ? 0x80000000 : 0) + Math.floor(a.data[1] / 2)]215 }216}217/**218 * Apply log2 to an ArrayInt64 (preserve sign)219 * @internal220 */221export function logLike64(a: ArrayInt64): ArrayInt64 {222 // Math.floor(Math.log(hi * 2**32 + low) / Math.log(2)) <= Math.floor(Math.log(2**64) / Math.log(2)) = 64223 return {224 sign: a.sign,225 data: [0, Math.floor(Math.log(a.data[0] * 0x100000000 + a.data[1]) / Math.log(2))]226 }227}228/** @internal */229const INDEX_POSITIVE_INFINITY: ArrayInt64 = { sign: 1, data: [2146435072, 0] } // doubleToIndex(Number.MAX_VALUE) + 1;230/** @internal */231const INDEX_NEGATIVE_INFINITY: ArrayInt64 = { sign: -1, data: [2146435072, 1] } // doubleToIndex(-Number.MAX_VALUE) - 1232/**233 * Decompose a 64-bit floating point number into a significand and exponent234 * such that:235 * - significand over 53 bits including sign (also referred as fraction)236 * - exponent over 11 bits including sign237 * - whenever there are multiple possibilities we take the one having the highest significand (in abs)238 * - Number.MAX_VALUE = 2**1023 * (1 + (2**52-1)/2**52)239 * = 2**1023 * (2 - Number.EPSILON)240 * - Number.MIN_VALUE = 2**(-1022) * 2**(-52)241 * - Number.EPSILON = 2**(-52)242 *243 * @param d - 64-bit floating point number to be decomposed into (significand, exponent)244 *245 * @internal246 */247export function decomposeDouble(d: number): { exponent: number, significand: number } {248 // 1 => significand 0b1 - exponent 1 (will be preferred)249 // => significand 0b0.1 - exponent 2250 const maxSignificand = 2 - Number.EPSILON251 for (let exponent = -1022; exponent !== 1024; ++exponent) {252 const powExponent = 2 ** exponent253 const maxForExponent = maxSignificand * powExponent254 if (Math.abs(d) <= maxForExponent) {255 return { exponent, significand: d / powExponent }256 }257 }258 return { exponent: Number.NaN, significand: Number.NaN }259}260/** @internal */261function positiveNumberToInt64(n: number): ArrayInt64['data'] {262 return [~~(n / 0x100000000), n >>> 0]263}264/** @internal */265function indexInDoubleFromDecomp(exponent: number, significand: number): ArrayInt64['data'] {266 // WARNING: significand >= 0267 // By construct of significand in decomposeDouble,268 // significand is always max-ed.269 // The double close to zero are the only one having a significand <1, they also have an exponent of -1022.270 // They are in range: [2**(-1022) * 2**(-52), 2**(-1022) * (2 - 2 ** 52)]271 // In other words there are 2**53 elements in that range if we include zero.272 // All other ranges (other exponents) have a length of 2**52 elements.273 if (exponent === -1022) {274 // We want the significand to be an integer value (like an index)275 const rescaledSignificand = significand * 2 ** 52 // significand * 2**52276 return positiveNumberToInt64(rescaledSignificand)277 }278 // Offset due to exp = -1022 + Offset of previous exp (excl. -1022) + Offset in current exp279 // 2**53 + (exponent - (-1022) -1) * 2**52 + (significand - 1) * 2**52280 // (exponent + 1023) * 2**52 + (significand - 1) * 2**52281 const rescaledSignificand = (significand - 1) * 2 ** 52 // (significand-1) * 2**52282 const exponentOnlyHigh = (exponent + 1023) * 2 ** 20 // (exponent + 1023) * 2**52 => [high: (exponent + 1023) * 2**20, low: 0]283 const index = positiveNumberToInt64(rescaledSignificand)284 index[0] += exponentOnlyHigh285 return index286}287/**288 * Compute the index of d relative to other available 64-bit floating point numbers289 * Rq: Produces negative indexes for negative doubles290 *291 * @param d - 64-bit floating point number, anything except NaN292 *293 * @internal294 */295export function doubleToIndex(d: number): ArrayInt64 {296 if (d === Number.POSITIVE_INFINITY) {297 return clone64(INDEX_POSITIVE_INFINITY)298 }299 if (d === Number.NEGATIVE_INFINITY) {300 return clone64(INDEX_NEGATIVE_INFINITY)301 }302 const decomp = decomposeDouble(d)303 const exponent = decomp.exponent304 const significand = decomp.significand305 if (d > 0 || (d === 0 && 1 / d === Number.POSITIVE_INFINITY)) {306 return { sign: 1, data: indexInDoubleFromDecomp(exponent, significand) }307 } else {308 const indexOpposite = indexInDoubleFromDecomp(exponent, -significand)309 if (indexOpposite[1] === 0xffffffff) {310 indexOpposite[0] += 1311 indexOpposite[1] = 0312 } else {313 indexOpposite[1] += 1314 }315 return { sign: -1, data: indexOpposite } // -indexInDoubleFromDecomp(exponent, -significand) - 1316 }317}318/**319 * Compute the 64-bit floating point number corresponding to the provided indexes320 *321 * @param n - index of the double322 *323 * @internal324 */325export function indexToDouble(index: ArrayInt64): number {326 if (index.sign === -1) {327 const indexOpposite: ArrayInt64 = { sign: 1, data: [index.data[0], index.data[1]] }328 if (indexOpposite.data[1] === 0) {329 indexOpposite.data[0] -= 1330 indexOpposite.data[1] = 0xffffffff331 } else {332 indexOpposite.data[1] -= 1333 }334 return -indexToDouble(indexOpposite) // -indexToDouble(-index - 1);335 }336 if (isEqual64(index, INDEX_POSITIVE_INFINITY)) {337 return Number.POSITIVE_INFINITY338 }339 if (index.data[0] < 0x200000) {340 // if: index < 2 ** 53 <--> index[0] < 2 ** (53-32) = 0x20_0000341 // The first 2**53 elements correspond to values having342 // exponent = -1022 and significand = index * Number.EPSILON343 // double value = index * 2 ** -1022 * Number.EPSILON344 // = index * 2 ** -1022 * 2 ** -52345 // = index * 2 ** -1074346 return (index.data[0] * 0x100000000 + index.data[1]) * 2 ** -1074347 }348 const postIndexHigh = index.data[0] - 0x200000 // postIndex = index - 2 ** 53349 // exponent = -1021 + Math.floor(postIndex / 2**52)350 // = -1021 + Math.floor(postIndexHigh / 2**(52-32))351 // = -1021 + Math.floor(postIndexHigh / 2**20)352 // = -1021 + (postIndexHigh >> 20)353 const exponent = -1021 + (postIndexHigh >> 20)354 // significand = 1 + (postIndex % 2**52) / 2**52355 // = 1 + ((postIndexHigh * 2**32 + postIndexLow) % 2**52) / 2**52356 // = 1 + ((postIndexHigh % 2**20) * 2**32 + postIndexLow) / 2**52357 // = 1 + ((postIndexHigh & 0xfffff) * 2**32 + postIndexLow) / 2**52358 // = 1 + ((postIndexHigh & 0xfffff) * 2**32 + postIndexLow) * Number.EPSILON359 const significand = 1 + ((postIndexHigh & 0xfffff) * 2 ** 32 + index.data[1]) * Number.EPSILON360 return significand * 2 ** exponent361}362/**363 * Same as {@link doubleToIndex} except it throws in case of invalid double364 *365 * @internal366 */367export function safeDoubleToIndex(d: number, label: string): I.IO<unknown, never, ArrayInt64> {368 if (Number.isNaN(d)) {369 // Number.NaN does not have any associated index in the current implementation370 return I.die(new Error('fc.doubleNext constraints.' + label + ' must be a 32-bit float'))371 }372 return I.succeed(doubleToIndex(d))373}374let EPSILON = Math.pow(2, -52)375let MAX_VALUE = (2 - EPSILON) * Math.pow(2, 1023)376let MIN_VALUE = Math.pow(2, -1022)377export function nextUp(x: number) {378 if (x !== x) {379 return x380 }381 if (x === -1 / 0) {382 return -MAX_VALUE383 }384 if (x === +1 / 0) {385 return +1 / 0386 }387 if (x === +MAX_VALUE) {388 return +1 / 0389 }390 let y = x * (x < 0 ? 1 - EPSILON / 2 : 1 + EPSILON)391 if (y === x) {392 y = MIN_VALUE * EPSILON > 0 ? x + MIN_VALUE * EPSILON : x + MIN_VALUE393 }394 if (y === +1 / 0) {395 y = +MAX_VALUE396 }397 let b = x + (y - x) / 2398 if (x < b && b < y) {399 y = b400 }401 let c = (y + x) / 2402 if (x < c && c < y) {403 y = c404 }405 return y === 0 ? -0 : y406}407export function nextAfter(x: number, y: number) {408 return y < x ? -nextUp(-x) : y > x ? nextUp(x) : x !== x ? x : y409}410export function computeBiasedRanges(411 min: ArrayInt64,412 max: ArrayInt64,413 biasedRanges?: { min: ArrayInt64, max: ArrayInt64 }[]414): { min: ArrayInt64, max: ArrayInt64 }[] {415 if (biasedRanges != null) {416 return biasedRanges417 }418 if (isEqual64(min, max)) {419 return [{ min, max }]420 }421 const minStrictlySmallerThanZero = isStrictlyNegative64(min)422 const maxStrictlyGreaterThanZero = isStrictlyPositive64(max)423 if (minStrictlySmallerThanZero && maxStrictlyGreaterThanZero) {424 const logMin = logLike64(min)425 const logMax = logLike64(max)426 return [427 { min: logMin, max: logMax },428 { min: substract64(max, logMax), max },429 { min, max: substract64(min, logMin) }430 ]431 } else {432 const logGap = logLike64(substract64(max, min))433 const closeToMin = { min, max: add64(min, logGap) }434 const closeToMax = { min: substract64(max, logGap), max }435 return minStrictlySmallerThanZero ? [closeToMax, closeToMin] : [closeToMin, closeToMax]436 }437}438export function computeArrayInt64GenerateRange(439 min: ArrayInt64,440 max: ArrayInt64,441 biasFactor: number | undefined,442 biasedRanges: { min: ArrayInt64, max: ArrayInt64 }[] | undefined443): I.URIO<Has<Random>, { min: ArrayInt64, max: ArrayInt64 }> {444 return I.gen(function* (_) {445 if (biasFactor === undefined || (yield* _(Random.nextIntBetween(1, biasFactor))) !== 1) {446 return { min, max }447 }448 const ranges = computeBiasedRanges(min, max, biasedRanges)...`

ArrayInt64Arbitrary.ts

Source:ArrayInt64Arbitrary.ts

`...55 isEqual64(this.max, unsafeValue))56 );57 }58 private shrinkArrayInt64(value: ArrayInt64, target: ArrayInt64, tryTargetAsap?: boolean): Stream<Value<ArrayInt64>> {59 const realGap = substract64(value, target);60 function* shrinkGen(): IterableIterator<Value<ArrayInt64>> {61 let previous: ArrayInt64 | undefined = tryTargetAsap ? undefined : target;62 const gap = tryTargetAsap ? realGap : halve64(realGap);63 for (let toremove = gap; !isZero64(toremove); toremove = halve64(toremove)) {64 const next = substract64(value, toremove);65 yield new Value(next, previous); // previous indicates the last passing value66 previous = next;67 }68 }69 return stream(shrinkGen());70 }71 shrink(current: ArrayInt64, context?: unknown): Stream<Value<ArrayInt64>> {72 if (!ArrayInt64Arbitrary.isValidContext(current, context)) {73 // No context:74 // Take default target and shrink towards it75 // Try the target on first try76 const target = this.defaultTarget();77 return this.shrinkArrayInt64(current, target, true);78 }79 if (this.isLastChanceTry(current, context)) {80 // Last chance try...81 // context is set to undefined, so that shrink will restart82 // without any assumptions in case our try find yet another bug83 return Stream.of(new Value(context, undefined));84 }85 // Normal shrink process86 return this.shrinkArrayInt64(current, context, false);87 }88 private defaultTarget(): ArrayInt64 {89 // min <= 0 && max >= 0 => shrink towards zero90 if (!isStrictlyPositive64(this.min) && !isStrictlyNegative64(this.max)) {91 return Zero64;92 }93 // min < 0 => shrink towards max (closer to zero)94 // otherwise => shrink towards min (closer to zero)95 return isStrictlyNegative64(this.min) ? this.max : this.min;96 }97 private isLastChanceTry(current: ArrayInt64, context: ArrayInt64): boolean {98 // Last chance corresponds to scenario where shrink should be empty99 // But we try a last thing just in case it can work100 if (isZero64(current)) {101 return false;102 }103 if (current.sign === 1) {104 return isEqual64(current, add64(context, Unit64)) && isStrictlyPositive64(substract64(current, this.min));105 } else {106 return isEqual64(current, substract64(context, Unit64)) && isStrictlyNegative64(substract64(current, this.max));107 }108 }109 private static isValidContext(_current: ArrayInt64, context?: unknown): context is ArrayInt64 {110 // Context contains a value between zero and current that is known to be111 // the closer to zero passing value*.112 // *More precisely: our shrinker will not try something closer to zero113 if (context === undefined) {114 return false;115 }116 if (typeof context !== 'object' || context === null || !('sign' in context) || !('data' in context)) {117 throw new Error(`Invalid context type passed to ArrayInt64Arbitrary (#1)`);118 }119 return true;120 }121 private retrieveBiasedRanges(): { min: ArrayInt64; max: ArrayInt64 }[] {122 if (this.biasedRanges != null) {123 return this.biasedRanges;124 }125 if (isEqual64(this.min, this.max)) {126 this.biasedRanges = [{ min: this.min, max: this.max }];127 return this.biasedRanges;128 }129 const minStrictlySmallerZero = isStrictlyNegative64(this.min);130 const maxStrictlyGreaterZero = isStrictlyPositive64(this.max);131 if (minStrictlySmallerZero && maxStrictlyGreaterZero) {132 // min < 0 && max > 0133 const logMin = logLike64(this.min); // min !== 0 -> <=0134 const logMax = logLike64(this.max); // max !== 0 -> >=0135 this.biasedRanges = [136 { min: logMin, max: logMax }, // close to zero,137 { min: substract64(this.max, logMax), max: this.max }, // close to max138 { min: this.min, max: substract64(this.min, logMin) }, // close to min139 ];140 } else {141 // Either min < 0 && max <= 0142 // Or min >= 0, so max >= 0143 const logGap = logLike64(substract64(this.max, this.min)); // max-min !== 0 -> >=0144 const arbCloseToMin = { min: this.min, max: add64(this.min, logGap) }; // close to min145 const arbCloseToMax = { min: substract64(this.max, logGap), max: this.max }; // close to max146 this.biasedRanges = minStrictlySmallerZero147 ? [arbCloseToMax, arbCloseToMin] // max is closer to zero148 : [arbCloseToMin, arbCloseToMax]; // min is closer to zero149 }150 return this.biasedRanges;151 }152}153/** @internal */154export function arrayInt64(min: ArrayInt64, max: ArrayInt64): Arbitrary<ArrayInt64> {155 const arb = new ArrayInt64Arbitrary(min, max);156 return arb;...`

double.ts

Source:double.ts

`...50 if (noNaN) {51 return G.map_(arrayInt64(minIndex, maxIndex), indexToDouble)52 }53 const positiveMaxIdx = isStrictlyPositive64(maxIndex)54 const minIndexWithNaN = positiveMaxIdx ? minIndex : substract64(minIndex, Unit64)55 const maxIndexWithNaN = positiveMaxIdx ? add64(maxIndex, Unit64) : maxIndex56 return G.map_(arrayInt64(minIndexWithNaN, maxIndexWithNaN), (index) => {57 if (isStrictlySmaller64(maxIndex, index) || isStrictlySmaller64(index, minIndex)) return Number.NaN58 else return indexToDouble(index)59 })60 }),61 G.unwrap62 )...`

Using AI Code Generation

`1const { substract64 } = require('fast-check-monorepo');2console.log(substract64(10, 5));3const { substract64 } = require('fast-check-monorepo');4console.log(substract64(10, 5));5const { substract64 } = require('fast-check-monorepo');6console.log(substract64(10, 5));7const { substract64 } = require('fast-check-monorepo');8console.log(substract64(10, 5));9const { substract64 } = require('fast-check-monorepo');10console.log(substract64(10, 5));11const { substract64 } = require('fast-check-monorepo');12console.log(substract64(10, 5));13const { substract64 } = require('fast-check-monorepo');14console.log(substract64(10, 5));15const { substract64 } = require('fast-check-monorepo');16console.log(substract64(10, 5));17const { substract64 } = require('fast-check-monorepo');18console.log(substract64(10, 5));19const { substract64 } = require('fast-check-monorepo');20console.log(substract64(10, 5));21const { substract64 } = require('fast-check-monorepo');22console.log(sub`

Using AI Code Generation

`1const fc = require('fast-check');2fc.substract64(1,2);3const fc = require('fast-check');4fc.substract64(1,2);5const fc = require('fast-check');6fc.substract64(1,2);7const fc = require('fast-check');8fc.substract64(1,2);9const fc = require('fast-check');10fc.substract64(1,2);11const fc = require('fast-check');12fc.substract64(1,2);13const fc = require('fast-check');14fc.substract64(1,2);15const fc = require('fast-check');16fc.substract64(1,2);17const fc = require('fast-check');18fc.substract64(1,2);19const fc = require('fast-check');20fc.substract64(1,2);21const fc = require('fast-check');22fc.substract64(1,2);23const fc = require('fast-check');24fc.substract64(1,2);25const fc = require('fast-check');26fc.substract64(1,2);`

Using AI Code Generation

`1const { substract64 } = require('fast-check-monorepo');2const result = substract64(3, 2);3console.log(result);4const { multiply64 } = require('fast-check-monorepo');5const result = multiply64(3, 2);6console.log(result);7const { divide64 } = require('fast-check-monorepo');8const result = divide64(3, 2);9console.log(result);10const { mod64 } = require('fast-check-monorepo');11const result = mod64(3, 2);12console.log(result);13const { and64 } = require('fast-check-monorepo');14const result = and64(3, 2);15console.log(result);16const { or64 } = require('fast-check-monorepo');17const result = or64(3, 2);18console.log(result);19const { xor64 } = require('fast-check-monorepo');20const result = xor64(3, 2);21console.log(result);22const { not64 } = require('fast-check-monorepo');23const result = not64(3);24console.log(result);25const { shl64 } = require('fast-check-monorepo');26const result = shl64(3, 2);27console.log(result);28const { shr64 } = require('fast-check-monorepo');29const result = shr64(3, 2);30console.log(result);`

Using AI Code Generation

`1const { substract64 } = require('fast-check-monorepo');2console.log(substract64(1, 2));3const { add64 } = require('fast-check-monorepo');4console.log(add64(1, 2));5{6 "dependencies": {7 }8}9module.exports = {10 add64: require('./add64'),11 substract64: require('./substract64')12};13const fc = require('fast-check');14const add64 = (a, b) => {15 const a64 = fc.integer(0, Number.MAX_SAFE_INTEGER);16 const b64 = fc.integer(0, Number.MAX_SAFE_INTEGER);17 return a64 + b64;18};19module.exports = add64;20const fc = require('fast-check');21const substract64 = (a, b) => {22 const a64 = fc.integer(0, Number.MAX_SAFE_INTEGER);23 const b64 = fc.integer(0, Number.MAX_SAFE_INTEGER);24 return a64 - b64;25};26module.exports = substract64;27const { add64 } = require('../fast-check-monorepo');28describe('add64', () =>`

Using AI Code Generation

`1const { substract64 } = require('fast-check-monorepo');2const assert = require('assert');3const a = 0x0000000000000000n;4const b = 0xffffffffffffffffn;5const expected = 0xffffffffffffffffn;6const actual = substract64(a, b);7assert.strictEqual(actual, expected);8const { substract64 } = require('fast-check-monorepo');9const assert = require('assert');10const a = 0x8000000000000000n;11const b = 0x8000000000000000n;12const expected = 0x0000000000000000n;13const actual = substract64(a, b);14assert.strictEqual(actual, expected);15const { substract64 } = require('fast-check-monorepo');16const assert = require('assert');17const a = 0x8000000000000000n;18const b = 0x8000000000000001n;19const expected = 0xffffffffffffffffn;20const actual = substract64(a, b);21assert.strictEqual(actual, expected);22const { substract64 } = require('fast-check-monorepo');23const assert = require('assert');24const a = 0x8000000000000000n;25const b = 0x8000000000000002n;26const expected = 0xfffffffffffffffen;27const actual = substract64(a, b);28assert.strictEqual(actual, expected);29const { substract64 } = require('fast-check-monorepo');30const assert = require('assert');31const a = 0x0000000000000000n;32const b = 0x0000000000000000n;33const expected = 0x0000000000000000n;34const actual = substract64(a, b);35assert.strictEqual(actual, expected);36const { substract64 } =`

Using AI Code Generation

`1const subtract64 = require('../test1/test1.js').subtract64;2const assert = require('assert');3describe('test3.js', () => {4 it('should substract 64 from 128', () => {5 assert.equal(subtract64(128), 64);6 });7});8const subtract64 = require('../test1/test1.js').subtract64;9const assert = require('assert');10describe('test4.js', () => {11 it('should substract 64 from 128', () => {12 assert.equal(subtract64(128), 64);13 });14});15const subtract64 = require('../test1/test1.js').subtract64;16const assert = require('assert');17describe('test5.js', () => {18 it('should substract 64 from 128', () => {19 assert.equal(subtract64(128), 64);20 });21});22const subtract64 = require('../test1/test1.js').subtract64;23const assert = require('assert');24describe('test6.js', () => {25 it('should substract 64 from 128', () => {26 assert.equal(subtract64(128), 64);27 });28});29const subtract64 = require('../test1/test1.js').subtract64;30const assert = require('assert');31describe('test7.js', () => {32 it('should substract 64 from 128', () => {33 assert.equal(subtract64(128), 64);34 });35});36const subtract64 = require('../test1/test1.js').subtract64;37const assert = require('assert');38describe('test8.js', () => {39 it('should substract 64 from 128', () => {40 assert.equal(subtract64(`

Using AI Code Generation

`1'use strict';2const fc = require('fast-check');3const test = require('tape');4const substract64 = require('fast-check-monorepo/packages/fast-check/src/check/arbitrary/IntegerArbitrary.ts').substract64;5test('test', (t) => {6 t.plan(1);7 const min = BigInt(0);8 const max = BigInt(2) ** BigInt(64) - BigInt(1);9 const arb = fc.integer({min, max});10 t.equal(arb.generate(1), substract64(max, min));11});12'use strict';13const fc = require('fast-check');14const test = require('tape');15const substract64 = require('fast-check-monorepo/packages/fast-check/src/check/arbitrary/IntegerArbitrary.ts').substract64;16test('test', (t) => {17 t.plan(1);18 const min = BigInt(0);19 const max = BigInt(2) ** BigInt(64) - BigInt(1);20 const arb = fc.integer({min, max});21 t.equal(arb.generate(1), substract64(max, min));22});23'use strict';24const fc = require('fast-check');25const test = require('tape');26const substract64 = require('fast-check-monorepo/packages/fast-check/src/check/arbitrary/IntegerArbitrary.ts').substract64;27test('test', (t) => {28 t.plan(1);29 const min = BigInt(0);30 const max = BigInt(2) ** BigInt(64) - BigInt(1);31 const arb = fc.integer({min, max});32 t.equal(arb.generate(1), substract64(max, min));33});`

## Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.