7

I am using truffle to develop a simple smart contract.

I have the following contract:

contract Puppy {

  enum State { good, bad }

  State public status;
  State public constant INITIAL_STATUS = State.good;

  function Puppy() {
    status = INITIAL_STATUS;
  }
}

And I wish to test it as follows:

const Puppy = artifacts.require('./Puppy.sol')

contract('Puppy', () => {
  it('sets the initial status to \'good\'', () => Puppy.deployed()
    .then(instance => instance.status())
    .then((status) => {
      assert.equal(status, Puppy.State.good, 'Expected the status to be \'good\'')
    }))
})

This throws TypeError: Cannot read property 'good' of undefined

If I change the test to

const Puppy = artifacts.require('./Puppy.sol')

contract('Puppy', () => {
  it('sets the initial status to \'good\'', () => Puppy.deployed()
    .then(instance => instance.status())
    .then((status) => {
      assert.equal(status, 0, 'Expected the status to be \'good\'')
    }))
})

it passes.

How do I refer to the enum from within the test?

5

You can't (for now), as enums are not supported by the ABI.

See https://solidity.readthedocs.io/en/latest/frequently-asked-questions.html#if-i-return-an-enum-i-only-get-integer-values-in-web3-js-how-to-get-the-named-values

There is a proposal to change that https://github.com/ethereum/EIPs/issues/47

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.