Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Commit 3d20ed1

Browse files
committed
refactor: testgen
1 parent 7580d69 commit 3d20ed1

17 files changed

+9227
-11897
lines changed

contracts/codegen/generateOverloads.ts

Lines changed: 214 additions & 130 deletions
Large diffs are not rendered by default.

contracts/codegen/main.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { mkdirSync, writeFileSync } from 'fs';
2+
import path from 'path';
23

34
import { validateFHETypes, validateOperators } from './common';
5+
import { generateOverloads } from './generateOverloads';
46
import { ALL_OPERATORS } from './operators';
57
import operatorsPrices from './operatorsPrices.json';
68
import { generateSolidityFHEGasLimit } from './payments';
79
import { generateSolidityImplLib, generateSolidityTFHELibAndOverloads } from './templates';
810
import {
9-
generateSolidityOverloads,
11+
generateSolidityOverloadTestFiles,
1012
generateSolidityUnitTestContracts,
1113
generateTypeScriptTestCode,
1214
splitOverloadsToShards,
@@ -40,8 +42,15 @@ function generateAllFiles() {
4042
writeFileSync('lib/TFHE.sol', tfheSolSource);
4143
writeFileSync('contracts/FHEGasLimit.sol', generateSolidityFHEGasLimit(operatorsPrices));
4244

43-
/// Generate overload, split them into shars, and generate Solidity contracts to be used for unit test files.
44-
const overloadShards = splitOverloadsToShards(generateSolidityOverloads(ALL_OPERATORS, ALL_FHE_TYPES));
45+
// TODO: For now, the testgen only supports automatically generated tests for euintXX.
46+
/// Generate overloads, split them into shards, and generate Solidity contracts to be used for TypeScript unit test files.
47+
writeFileSync(
48+
`${path.resolve(__dirname)}/overloads.json`,
49+
JSON.stringify(generateOverloads(ALL_FHE_TYPES), (_key, value) =>
50+
typeof value === 'bigint' ? value.toString() : value,
51+
),
52+
);
53+
const overloadShards = splitOverloadsToShards(generateSolidityOverloadTestFiles(ALL_OPERATORS, ALL_FHE_TYPES));
4554
mkdirSync('contracts/tests', { recursive: true });
4655
overloadShards.forEach((os) => {
4756
writeFileSync(`examples/tests/TFHETestSuite${os.shardNumber}.sol`, generateSolidityUnitTestContracts(os));

contracts/codegen/overloads.json

Lines changed: 2183 additions & 4974 deletions
Large diffs are not rendered by default.

contracts/codegen/testgen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { overloadTests } from './overloadTests';
1414
import { getUint } from './utils';
1515

16-
export function generateSolidityOverloads(operators: Operator[], fheTypes: FheType[]): OverloadSignature[] {
16+
export function generateSolidityOverloadTestFiles(operators: Operator[], fheTypes: FheType[]): OverloadSignature[] {
1717
const signatures: OverloadSignature[] = [];
1818

1919
// Exclude types that do not support any operators.

contracts/codegen/utils.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,35 @@ export const getUint = (bits: number) => {
99
if (bits < 8) throw new Error('Bits must be greater than 8');
1010
return `uint${bits}`;
1111
};
12+
/**
13+
* Finds the minimum value among a list of `bigint` numbers.
14+
*
15+
* @param args - An array of `bigint` values to compare.
16+
* @returns The smallest `bigint` value from the provided arguments.
17+
*/
18+
export const findMinimumValueInBigIntArray = (...args: bigint[]) => {
19+
return args.reduce((min, e) => (e < min ? e : min), args[0]);
20+
};
21+
22+
/**
23+
* Finds the maximum value among a list of `bigint` numbers.
24+
*
25+
* @param args - An array of `bigint` numbers to compare.
26+
* @returns The largest `bigint` value from the provided arguments.
27+
*/
28+
export const findMaximumValueInBigIntArray = (...args: bigint[]) => {
29+
return args.reduce((max, e) => (e > max ? e : max), args[0]);
30+
};
31+
32+
/**
33+
* Generates a random number within a specified bit range.
34+
*
35+
* @param bits - The number of bits to determine the range of the generated number.
36+
* @returns A random BigInt number within the range defined by the number of bits.
37+
*/
38+
export const generateRandomNumber = (bits: number) => {
39+
const power = BigInt(Math.pow(2, bits) - 1);
40+
const maxRange = findMinimumValueInBigIntArray(power, BigInt(Number.MAX_SAFE_INTEGER));
41+
const subtract = findMaximumValueInBigIntArray(BigInt(Math.floor(Math.random() * Number(maxRange))), 1n);
42+
return findMaximumValueInBigIntArray(power - subtract, 1n);
43+
};

0 commit comments

Comments
 (0)