@0x:contracts-integrations Addressed more review feedback
				
					
				
			This commit is contained in:
		@@ -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 { 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 { 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.
 | 
			
		||||
     */
 | 
			
		||||
    protected async _configureTokenForAddressAsync(
 | 
			
		||||
        deploymentManager: DeploymentManager, address: string,
 | 
			
		||||
        deploymentManager: DeploymentManager,
 | 
			
		||||
        address: string,
 | 
			
		||||
        token: DummyERC20TokenContract,
 | 
			
		||||
    ): Promise<void> {
 | 
			
		||||
        await token.setBalance.awaitTransactionSuccessAsync(address, constants.INITIAL_ERC20_BALANCE);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
import { ContractGetterFunction } from './function_assertions';
 | 
			
		||||
import * as _ from 'lodash';
 | 
			
		||||
 | 
			
		||||
export class GetterCache {
 | 
			
		||||
export class GetterCache<TCallArgs extends any[]> {
 | 
			
		||||
    // 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
 | 
			
		||||
    // because the "Map" datastructure uses reference equality when the keys are objects,
 | 
			
		||||
@@ -12,7 +12,7 @@ export class GetterCache {
 | 
			
		||||
        [key: string]: any;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    constructor(getter: ContractGetterFunction) {
 | 
			
		||||
    constructor(getter: ContractGetterFunction<TCallArgs>) {
 | 
			
		||||
        this.getter = getter;
 | 
			
		||||
        this.cache = {};
 | 
			
		||||
    }
 | 
			
		||||
@@ -25,7 +25,7 @@ export class GetterCache {
 | 
			
		||||
     *                arguments must be valid arguments to "getABIEncodedTransactionData".
 | 
			
		||||
     * @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 cachedResult = this.cache[key];
 | 
			
		||||
 | 
			
		||||
@@ -47,7 +47,7 @@ export class GetterCache {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface GetterCacheSet {
 | 
			
		||||
    [getter: string]: GetterCache;
 | 
			
		||||
    [getter: string]: GetterCache<any[]>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class GetterCacheCollection {
 | 
			
		||||
@@ -60,16 +60,8 @@ export class GetterCacheCollection {
 | 
			
		||||
     * @param getterNames The names of the getter functions to register.
 | 
			
		||||
     * @param getters The getter functions to register.
 | 
			
		||||
     */
 | 
			
		||||
    constructor(getterNames: string[], getters: ContractGetterFunction[]) {
 | 
			
		||||
        if (getterNames.length !== getters.length) {
 | 
			
		||||
            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);
 | 
			
		||||
        }
 | 
			
		||||
    constructor(getters: GetterCacheSet) {
 | 
			
		||||
        this.getters = getters;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@@ -77,7 +69,7 @@ export class GetterCacheCollection {
 | 
			
		||||
     * @param getterName The name of the 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,28 +1,31 @@
 | 
			
		||||
import { PromiseWithTransactionHash } from '@0x/base-contract';
 | 
			
		||||
import { TransactionReceiptWithDecodedLogs } from 'ethereum-types';
 | 
			
		||||
 | 
			
		||||
export interface ContractGetterFunction {
 | 
			
		||||
    callAsync: (...args: any[]) => Promise<any>;
 | 
			
		||||
    getABIEncodedTransactionData: (...args: any[]) => string;
 | 
			
		||||
export interface ContractGetterFunction<TCallArgs extends any[]> {
 | 
			
		||||
    callAsync: (...args: TCallArgs) => Promise<any>;
 | 
			
		||||
    getABIEncodedTransactionData: (...args: TCallArgs) => string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ContractWrapperFunction extends ContractGetterFunction {
 | 
			
		||||
    awaitTransactionSuccessAsync?: (...args: any[]) => PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs>;
 | 
			
		||||
export interface ContractWrapperFunction<TAwaitArgs extends any[], TCallArgs extends any[]>
 | 
			
		||||
    extends ContractGetterFunction<TCallArgs> {
 | 
			
		||||
    awaitTransactionSuccessAsync?: (
 | 
			
		||||
        ...args: TAwaitArgs
 | 
			
		||||
    ) => PromiseWithTransactionHash<TransactionReceiptWithDecodedLogs>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface Condition {
 | 
			
		||||
    before: (...args: any[]) => Promise<void>;
 | 
			
		||||
    after: (result: any, receipt: TransactionReceiptWithDecodedLogs | undefined, ...args: any[]) => Promise<void>;
 | 
			
		||||
    before: (...args: any[]) => Promise<any>;
 | 
			
		||||
    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.
 | 
			
		||||
    public condition: Condition;
 | 
			
		||||
 | 
			
		||||
    // 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.wrapperFunction = wrapperFunction;
 | 
			
		||||
    }
 | 
			
		||||
@@ -31,13 +34,33 @@ export class FunctionAssertion {
 | 
			
		||||
     * Runs the wrapped function and fails if the before or after assertions fail.
 | 
			
		||||
     * @param ...args The args to the contract wrapper function.
 | 
			
		||||
     */
 | 
			
		||||
    public async runAsync(...args: any[]): Promise<void> {
 | 
			
		||||
        await this.condition.before(...args);
 | 
			
		||||
        const result = await this.wrapperFunction.callAsync(...args);
 | 
			
		||||
        const receipt =
 | 
			
		||||
            this.wrapperFunction.awaitTransactionSuccessAsync !== undefined
 | 
			
		||||
                ? await this.wrapperFunction.awaitTransactionSuccessAsync(...args)
 | 
			
		||||
                : undefined;
 | 
			
		||||
        await this.condition.after(result, receipt, ...args);
 | 
			
		||||
    public async runAsync(args: TAwaitArgs & TCallArgs): Promise<{ beforeInfo: any; afterInfo: any }> {
 | 
			
		||||
        // Call the before condition.
 | 
			
		||||
        const beforeInfo = await this.condition.before(...args);
 | 
			
		||||
 | 
			
		||||
        // 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
 | 
			
		||||
                    ? await this.wrapperFunction.awaitTransactionSuccessAsync(...args)
 | 
			
		||||
                    : undefined;
 | 
			
		||||
        } 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,
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user