Implement host API for big decimal equals (#476)

* Implement host api for big decimal equals

* Add test cases for big decimal equals

* Use boolean type conversion

---------

Co-authored-by: neeraj <neeraj.rtly@gmail.com>
This commit is contained in:
Nabarun Gogoi 2023-11-17 10:26:03 +05:30 committed by GitHub
parent 7c8f84b1dc
commit e54f4c9276
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 1 deletions

View File

@ -478,7 +478,23 @@ export const instantiate = async (
return powResultBigDecimal;
},
'bigDecimal.equals': async (x: number, y: number) => {
// Create decimal x string.
const xBigDecimal = await BigDecimal.wrap(x);
const xStringPtr = await xBigDecimal.toString();
const xDecimalString = __getString(xStringPtr);
const xDecimal = new GraphDecimal(xDecimalString);
// Create decimal y string.
const yBigDecimal = await BigDecimal.wrap(y);
const yStringPtr = await yBigDecimal.toString();
const yDecimalString = __getString(yStringPtr);
// Perform the decimal equal operation.
const isEqual = xDecimal.equals(yDecimalString);
return isEqual;
},
'bigInt.fromString': async (s: number) => {
const string = __getString(s);

View File

@ -638,4 +638,22 @@ describe('numbers wasm tests', () => {
expect(__getString(ptr)).to.equal(expected);
});
});
describe('should execute bigDecimal equals API', () => {
let testBigDecimalEquals: any, __newString: any;
before(() => {
({ testBigDecimalEquals, __newString } = exports);
});
it('should check given bigDecimals are equal', async () => {
const ptr = await testBigDecimalEquals(await __newString('231543212.2132354'), await __newString('231543212.2132354'));
expect(Boolean(ptr)).to.equal(true);
});
it('should check given bigDecimals are not equal', async () => {
const ptr = await testBigDecimalEquals(await __newString('231543212.2132354'), await __newString('54652.65645'));
expect(Boolean(ptr)).to.equal(false);
});
});
});

View File

@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { Address, log, BigInt, BigDecimal, ByteArray, dataSource, ethereum, Bytes, crypto, json, JSONValueKind } from '@graphprotocol/graph-ts';
import { Address, log, BigInt, BigDecimal, bigDecimal, ByteArray, dataSource, ethereum, Bytes, crypto, json, JSONValueKind } from '@graphprotocol/graph-ts';
import {
Example1,
@ -299,6 +299,15 @@ export function testBigDecimalTimes (value1: string, value2: string): string {
return res.toString();
}
export function testBigDecimalEquals (value1: string, value2: string): boolean {
log.debug('In test bigDecimal.equals', []);
const bigDecimal1 = bigDecimal.fromString(value1);
const bigDecimal2 = bigDecimal.fromString(value2);
return bigDecimal1.equals(bigDecimal2);
}
export function testBigIntPlus (value1: string, value2: string): string {
log.debug('In test bigInt.plus', []);

View File

@ -151,6 +151,13 @@ export class GraphDecimal {
return this.value.cmp(param);
}
equals (n: Decimal.Value | GraphDecimal): boolean {
this._checkOutOfRange(this);
const param = this._checkOutOfRange(n);
return this.value.equals(param);
}
/**
* Function to check and throw an error if a given value has exponent out of the specified range (MIN_EXP to MAX_EXP).
* @param n A Decimal value to check the range for.