@ -1,8 +1,9 @@
const { expectRevert } = require ( '@openzeppelin/test-helpers' ) ;
const { asser t } = require ( 'chai' ) ;
const { expec t } = require ( 'chai' ) ;
const InitializableMock = artifacts . require ( 'InitializableMock' ) ;
const ConstructorInitializableMock = artifacts . require ( 'ConstructorInitializableMock' ) ;
const ReinitializerMock = artifacts . require ( 'ReinitializerMock' ) ;
const SampleChild = artifacts . require ( 'SampleChild' ) ;
contract ( 'Initializable' , function ( accounts ) {
@ -13,7 +14,7 @@ contract('Initializable', function (accounts) {
context ( 'before initialize' , function ( ) {
it ( 'initializer has not run' , async function ( ) {
assert . isFalse ( await this . contract . initializerRan ( ) ) ;
expect ( await this . contract . initializerRan ( ) ) . to . equal ( false ) ;
} ) ;
} ) ;
@ -23,7 +24,7 @@ contract('Initializable', function (accounts) {
} ) ;
it ( 'initializer has run' , async function ( ) {
assert . isTrue ( await this . contract . initializerRan ( ) ) ;
expect ( await this . contract . initializerRan ( ) ) . to . equal ( true ) ;
} ) ;
it ( 'initializer does not run again' , async function ( ) {
@ -38,7 +39,7 @@ contract('Initializable', function (accounts) {
it ( 'onlyInitializing modifier succeeds' , async function ( ) {
await this . contract . onlyInitializingNested ( ) ;
assert . isTrue ( await this . contract . onlyInitializingRan ( ) ) ;
expect ( await this . contract . onlyInitializingRan ( ) ) . to . equal ( true ) ;
} ) ;
} ) ;
@ -49,15 +50,69 @@ contract('Initializable', function (accounts) {
it ( 'nested initializer can run during construction' , async function ( ) {
const contract2 = await ConstructorInitializableMock . new ( ) ;
assert . isTrue ( await contract2 . initializerRan ( ) ) ;
assert . isTrue ( await contract2 . onlyInitializingRan ( ) ) ;
expect ( await contract2 . initializerRan ( ) ) . to . equal ( true ) ;
expect ( await contract2 . onlyInitializingRan ( ) ) . to . equal ( true ) ;
} ) ;
describe ( 'reinitialization' , function ( ) {
beforeEach ( 'deploying' , async function ( ) {
this . contract = await ReinitializerMock . new ( ) ;
} ) ;
it ( 'can reinitialize' , async function ( ) {
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '0' ) ;
await this . contract . initialize ( ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '1' ) ;
await this . contract . reinitialize ( 2 ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '2' ) ;
await this . contract . reinitialize ( 3 ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '3' ) ;
} ) ;
it ( 'can jump multiple steps' , async function ( ) {
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '0' ) ;
await this . contract . initialize ( ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '1' ) ;
await this . contract . reinitialize ( 128 ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '2' ) ;
} ) ;
it ( 'cannot nest reinitializers' , async function ( ) {
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '0' ) ;
await expectRevert ( this . contract . nestedReinitialize ( 2 , 3 ) , 'Initializable: contract is already initialized' ) ;
await expectRevert ( this . contract . nestedReinitialize ( 3 , 2 ) , 'Initializable: contract is already initialized' ) ;
} ) ;
it ( 'can chain reinitializers' , async function ( ) {
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '0' ) ;
await this . contract . chainReinitialize ( 2 , 3 ) ;
expect ( await this . contract . counter ( ) ) . to . be . bignumber . equal ( '2' ) ;
} ) ;
describe ( 'contract locking' , function ( ) {
it ( 'prevents initialization' , async function ( ) {
await this . contract . disableInitializers ( ) ;
await expectRevert ( this . contract . initialize ( ) , 'Initializable: contract is already initialized' ) ;
} ) ;
it ( 'prevents re-initialization' , async function ( ) {
await this . contract . disableInitializers ( ) ;
await expectRevert ( this . contract . reinitialize ( 255 ) , 'Initializable: contract is already initialized' ) ;
} ) ;
it ( 'can lock contract after initialization' , async function ( ) {
await this . contract . initialize ( ) ;
await this . contract . disableInitializers ( ) ;
await expectRevert ( this . contract . reinitialize ( 255 ) , 'Initializable: contract is already initialized' ) ;
} ) ;
} ) ;
} ) ;
describe ( 'complex testing with inheritance' , function ( ) {
const mother = 12 ;
const mother = '12' ;
const gramps = '56' ;
const father = 34 ;
const child = 78 ;
const father = '34' ;
const child = '78' ;
beforeEach ( 'deploying' , async function ( ) {
this . contract = await SampleChild . new ( ) ;
@ -68,23 +123,23 @@ contract('Initializable', function (accounts) {
} ) ;
it ( 'initializes human' , async function ( ) {
assert . equal ( await this . contract . isHuman ( ) , true ) ;
expect ( await this . contract . isHuman ( ) ) . to . be . equal ( true ) ;
} ) ;
it ( 'initializes mother' , async function ( ) {
assert . equal ( await this . contract . mother ( ) , mother ) ;
expect ( await this . contract . mother ( ) ) . to . be . bignumber . equal ( mother ) ;
} ) ;
it ( 'initializes gramps' , async function ( ) {
assert . equal ( await this . contract . gramps ( ) , gramps ) ;
expect ( await this . contract . gramps ( ) ) . to . be . bignumber . equal ( gramps ) ;
} ) ;
it ( 'initializes father' , async function ( ) {
assert . equal ( await this . contract . father ( ) , father ) ;
expect ( await this . contract . father ( ) ) . to . be . bignumber . equal ( father ) ;
} ) ;
it ( 'initializes child' , async function ( ) {
assert . equal ( await this . contract . child ( ) , child ) ;
expect ( await this . contract . child ( ) ) . to . be . bignumber . equal ( child ) ;
} ) ;
} ) ;
} ) ;