@0x:contracts-integrations
Addressed more review feedback
This commit is contained in:
parent
a794a33551
commit
c87364f86b
@ -1,4 +1,4 @@
|
|||||||
import { blockchainTests, expect } from '@0x/contracts-test-utils';
|
/*import { blockchainTests, expect } from '@0x/contracts-test-utils';
|
||||||
import { BigNumber } from '@0x/utils';
|
import { BigNumber } from '@0x/utils';
|
||||||
|
|
||||||
import { artifacts, TestFrameworkContract } from '../../src';
|
import { artifacts, TestFrameworkContract } from '../../src';
|
||||||
@ -73,3 +73,4 @@ blockchainTests('TestFramework', env => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { blockchainTests, constants, expect, filterLogsToArguments, hexRandom } from '@0x/contracts-test-utils';
|
/*import { blockchainTests, constants, expect, filterLogsToArguments, hexRandom } from '@0x/contracts-test-utils';
|
||||||
import { BigNumber, generatePseudoRandom256BitNumber } from '@0x/utils';
|
import { BigNumber, generatePseudoRandom256BitNumber } from '@0x/utils';
|
||||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
||||||
|
|
||||||
@ -123,3 +123,4 @@ blockchainTests.resets('FunctionAssertion Unit Tests', env => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
@ -78,7 +78,8 @@ export class AddressManager {
|
|||||||
* to transfer the token.
|
* to transfer the token.
|
||||||
*/
|
*/
|
||||||
protected async _configureTokenForAddressAsync(
|
protected async _configureTokenForAddressAsync(
|
||||||
deploymentManager: DeploymentManager, address: string,
|
deploymentManager: DeploymentManager,
|
||||||
|
address: string,
|
||||||
token: DummyERC20TokenContract,
|
token: DummyERC20TokenContract,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await token.setBalance.awaitTransactionSuccessAsync(address, constants.INITIAL_ERC20_BALANCE);
|
await token.setBalance.awaitTransactionSuccessAsync(address, constants.INITIAL_ERC20_BALANCE);
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
import { ContractGetterFunction } from './function_assertions';
|
import { ContractGetterFunction } from './function_assertions';
|
||||||
import * as _ from 'lodash';
|
import * as _ from 'lodash';
|
||||||
|
|
||||||
export class GetterCache {
|
export class GetterCache<TCallArgs extends any[]> {
|
||||||
// The getter function whose values will be cached.
|
// The getter function whose values will be cached.
|
||||||
public getter: ContractGetterFunction;
|
public getter: ContractGetterFunction<TCallArgs>;
|
||||||
|
|
||||||
// The cache that will be used to store values. This has to use a "string" for indexing
|
// The cache that will be used to store values. This has to use a "string" for indexing
|
||||||
// because the "Map" datastructure uses reference equality when the keys are objects,
|
// because the "Map" datastructure uses reference equality when the keys are objects,
|
||||||
@ -12,7 +12,7 @@ export class GetterCache {
|
|||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(getter: ContractGetterFunction) {
|
constructor(getter: ContractGetterFunction<TCallArgs>) {
|
||||||
this.getter = getter;
|
this.getter = getter;
|
||||||
this.cache = {};
|
this.cache = {};
|
||||||
}
|
}
|
||||||
@ -25,7 +25,7 @@ export class GetterCache {
|
|||||||
* arguments must be valid arguments to "getABIEncodedTransactionData".
|
* arguments must be valid arguments to "getABIEncodedTransactionData".
|
||||||
* @return Either a cached value or the queried value.
|
* @return Either a cached value or the queried value.
|
||||||
*/
|
*/
|
||||||
public async callAsync(...args: any[]): Promise<any> {
|
public async callAsync(...args: TCallArgs): Promise<any> {
|
||||||
const key = this.getter.getABIEncodedTransactionData(...args);
|
const key = this.getter.getABIEncodedTransactionData(...args);
|
||||||
const cachedResult = this.cache[key];
|
const cachedResult = this.cache[key];
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ export class GetterCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface GetterCacheSet {
|
export interface GetterCacheSet {
|
||||||
[getter: string]: GetterCache;
|
[getter: string]: GetterCache<any[]>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GetterCacheCollection {
|
export class GetterCacheCollection {
|
||||||
@ -60,16 +60,8 @@ export class GetterCacheCollection {
|
|||||||
* @param getterNames The names of the getter functions to register.
|
* @param getterNames The names of the getter functions to register.
|
||||||
* @param getters The getter functions to register.
|
* @param getters The getter functions to register.
|
||||||
*/
|
*/
|
||||||
constructor(getterNames: string[], getters: ContractGetterFunction[]) {
|
constructor(getters: GetterCacheSet) {
|
||||||
if (getterNames.length !== getters.length) {
|
this.getters = getters;
|
||||||
throw new Error('Mismatched getter names and getters');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register all of the getters.
|
|
||||||
this.getters = {};
|
|
||||||
for (const getter of _.zip(getterNames, getters)) {
|
|
||||||
this.registerGetter(getter[0] as string, getter[1] as ContractGetterFunction);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,7 +69,7 @@ export class GetterCacheCollection {
|
|||||||
* @param getterName The name of the contract getter function.
|
* @param getterName The name of the contract getter function.
|
||||||
* @param getter The actual contract getter function.
|
* @param getter The actual contract getter function.
|
||||||
*/
|
*/
|
||||||
public registerGetter(getterName: string, getter: ContractGetterFunction): void {
|
public registerGetter(getterName: string, getter: ContractGetterFunction<any[]>): void {
|
||||||
this.getters[getterName] = new GetterCache(getter);
|
this.getters[getterName] = new GetterCache(getter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,28 +1,31 @@
|
|||||||
import { PromiseWithTransactionHash } from '@0x/base-contract';
|
import { PromiseWithTransactionHash } from '@0x/base-contract';
|
||||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
||||||
|
|
||||||
export interface ContractGetterFunction {
|
export interface ContractGetterFunction<TCallArgs extends any[]> {
|
||||||
callAsync: (...args: any[]) => Promise<any>;
|
callAsync: (...args: TCallArgs) => Promise<any>;
|
||||||
getABIEncodedTransactionData: (...args: any[]) => string;
|
getABIEncodedTransactionData: (...args: TCallArgs) => string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ContractWrapperFunction extends ContractGetterFunction {
|
export interface ContractWrapperFunction<TAwaitArgs extends any[], TCallArgs extends any[]>
|
||||||
awaitTransactionSuccessAsync?: (...args: any[]) => PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs>;
|
extends ContractGetterFunction<TCallArgs> {
|
||||||
|
awaitTransactionSuccessAsync?: (
|
||||||
|
...args: TAwaitArgs
|
||||||
|
) => PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Condition {
|
export interface Condition {
|
||||||
before: (...args: any[]) => Promise<void>;
|
before: (...args: any[]) => Promise<any>;
|
||||||
after: (result: any, receipt: TransactionReceiptWithDecodedLogs | undefined, ...args: any[]) => Promise<void>;
|
after: (beforeInfo: any, result: Result, ...args: any[]) => Promise<any>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class FunctionAssertion {
|
export class FunctionAssertion<TAwaitArgs extends any[], TCallArgs extends any[]> {
|
||||||
// A before and an after assertion that will be called around the wrapper function.
|
// A before and an after assertion that will be called around the wrapper function.
|
||||||
public condition: Condition;
|
public condition: Condition;
|
||||||
|
|
||||||
// The wrapper function that will be wrapped in assertions.
|
// The wrapper function that will be wrapped in assertions.
|
||||||
public wrapperFunction: ContractWrapperFunction;
|
public wrapperFunction: ContractWrapperFunction<TAwaitArgs, TCallArgs>;
|
||||||
|
|
||||||
constructor(wrapperFunction: ContractWrapperFunction, condition: Condition) {
|
constructor(wrapperFunction: ContractWrapperFunction<TAwaitArgs, TCallArgs>, condition: Condition) {
|
||||||
this.condition = condition;
|
this.condition = condition;
|
||||||
this.wrapperFunction = wrapperFunction;
|
this.wrapperFunction = wrapperFunction;
|
||||||
}
|
}
|
||||||
@ -31,13 +34,33 @@ export class FunctionAssertion {
|
|||||||
* Runs the wrapped function and fails if the before or after assertions fail.
|
* Runs the wrapped function and fails if the before or after assertions fail.
|
||||||
* @param ...args The args to the contract wrapper function.
|
* @param ...args The args to the contract wrapper function.
|
||||||
*/
|
*/
|
||||||
public async runAsync(...args: any[]): Promise<void> {
|
public async runAsync(args: TAwaitArgs & TCallArgs): Promise<{ beforeInfo: any; afterInfo: any }> {
|
||||||
await this.condition.before(...args);
|
// Call the before condition.
|
||||||
const result = await this.wrapperFunction.callAsync(...args);
|
const beforeInfo = await this.condition.before(...args);
|
||||||
const receipt =
|
|
||||||
|
// Initialize the callResult so that the default success value is true.
|
||||||
|
let callResult: Result = { success: true };
|
||||||
|
|
||||||
|
// Try to make the call to the function. If it is successful, pass the
|
||||||
|
// result and receipt to the after condition.
|
||||||
|
try {
|
||||||
|
callResult.data = await this.wrapperFunction.callAsync(...args);
|
||||||
|
callResult.receipt =
|
||||||
this.wrapperFunction.awaitTransactionSuccessAsync !== undefined
|
this.wrapperFunction.awaitTransactionSuccessAsync !== undefined
|
||||||
? await this.wrapperFunction.awaitTransactionSuccessAsync(...args)
|
? await this.wrapperFunction.awaitTransactionSuccessAsync(...args)
|
||||||
: undefined;
|
: undefined;
|
||||||
await this.condition.after(result, receipt, ...args);
|
} catch (error) {
|
||||||
|
callResult.data = error;
|
||||||
|
callResult.success = false;
|
||||||
|
callResult.receipt = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call the after condition.
|
||||||
|
const afterInfo = await this.condition.after(beforeInfo, callResult, ...args);
|
||||||
|
|
||||||
|
return {
|
||||||
|
beforeInfo,
|
||||||
|
afterInfo,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user