|
//------------------------------------------------- |
|
|
|
enum Color { |
|
RED, GREEN, BLUE |
|
} |
|
assert.ok(Color.RED instanceof Color); |
|
assert.strictEqual(String(Color.RED), 'Color.RED'); |
|
assert.strictEqual(Color.GREEN.ordinal, 1); |
|
assert.strictEqual(Color.enumValueOf('BLUE'), Color.BLUE); |
|
assert.deepStrictEqual(Color.enumValues, [Color.RED, Color.GREEN, Color.BLUE]); |
|
assert.throws(() => { |
|
// Can’t create new instances |
|
new Color(); |
|
}); |
|
|
|
|
|
//------------------------------------------------- |
|
|
|
// Alas, data properties don’t work, because the enum |
|
// values (TicTacToeColor.X etc.) don’t exist when |
|
// the property definitions are evaluated. |
|
enum TicTacToeColor { |
|
O { |
|
get inverse() { return TicTacToeColor.X } |
|
}, |
|
X { |
|
get inverse() { return TicTacToeColor.O } |
|
}, |
|
} |
|
assert.strictEqual(TicTacToeColor.X.inverse, TicTacToeColor.O); |
|
assert.strictEqual(TicTacToeColor.O.inverse, TicTacToeColor.X); |
|
assert.strictEqual(String(TicTacToeColor.O), 'TicTacToeColor.O'); |
|
assert.strictEqual(TicTacToeColor.O.ordinal, 0); |
|
assert.strictEqual(TicTacToeColor.X.ordinal, 1); |
|
|
|
//------------------------------------------------- |
|
|
|
enum Weekday { |
|
MONDAY, TUESDAY, WEDNESDAY, |
|
THURSDAY, FRIDAY, SATURDAY, SUNDAY; |
|
isBusinessDay() { |
|
switch (this) { |
|
case Weekday.SATURDAY: |
|
case Weekday.SUNDAY: |
|
return false; |
|
default: |
|
return true; |
|
} |
|
} |
|
} |
|
assert.strictEqual(Weekday.SATURDAY.isBusinessDay(), false); |
|
assert.strictEqual(Weekday.MONDAY.isBusinessDay(), true); |
|
|
|
//------------------------------------------------- |
|
|
|
enum Result { |
|
ACCEPTED, REJECTED |
|
} |
|
|
|
enum State { |
|
START { |
|
enter(iter) { |
|
const {value,done} = iter.next(); |
|
if (done) { |
|
return Result.REJECTED; |
|
} |
|
switch (value) { |
|
case 'A': |
|
return State.A_SEQUENCE; |
|
default: |
|
return Result.REJECTED; |
|
} |
|
} |
|
}, |
|
A_SEQUENCE { |
|
enter(iter) { |
|
const {value,done} = iter.next(); |
|
if (done) { |
|
return Result.REJECTED; |
|
} |
|
switch (value) { |
|
case 'A': |
|
return State.A_SEQUENCE; |
|
case 'B': |
|
return State.B_SEQUENCE; |
|
default: |
|
return Result.REJECTED; |
|
} |
|
} |
|
}, |
|
B_SEQUENCE { |
|
enter(iter) { |
|
const {value,done} = iter.next(); |
|
if (done) { |
|
return State.ACCEPT; |
|
} |
|
switch (value) { |
|
case 'B': |
|
return State.B_SEQUENCE; |
|
default: |
|
return Result.REJECTED; |
|
} |
|
} |
|
}, |
|
ACCEPT { |
|
enter(iter) { |
|
return Result.ACCEPTED; |
|
} |
|
}, |
|
} |
|
function runStateMachine(str) { |
|
let iter = str[Symbol.iterator](); |
|
let state = State.START; |
|
while (true) { |
|
state = state.enter(iter); |
|
switch (state) { |
|
case Result.ACCEPTED: |
|
return true; |
|
case Result.REJECTED: |
|
return false; |
|
} |
|
} |
|
} |
|
assert.strictEqual(runStateMachine('AABBB'), true, 'AABBB'); |
|
assert.strictEqual(runStateMachine('AA'), false, 'AA'); |
|
assert.strictEqual(runStateMachine('BBB'), false, 'BBB'); |
|
assert.strictEqual(runStateMachine('AABBC'), false, 'AABBC'); |
|
assert.strictEqual(runStateMachine(''), false, ''); |
|
|
|
//------------------------------------------------- |
|
|
|
enum Mode { |
|
USER_R { |
|
n: 0b100000000, |
|
}, |
|
USER_W { |
|
n: 0b010000000, |
|
}, |
|
USER_X { |
|
n: 0b001000000, |
|
}, |
|
GROUP_R { |
|
n: 0b000100000, |
|
}, |
|
GROUP_W { |
|
n: 0b000010000, |
|
}, |
|
GROUP_X { |
|
n: 0b000001000, |
|
}, |
|
ALL_R { |
|
n: 0b000000100, |
|
}, |
|
ALL_W { |
|
n: 0b000000010, |
|
}, |
|
ALL_X { |
|
n: 0b000000001, |
|
}, |
|
} |
|
assert.strictEqual( |
|
Mode.USER_R.n | Mode.USER_W.n | Mode.USER_X.n | |
|
Mode.GROUP_R.n | Mode.GROUP_X.n | |
|
Mode.ALL_R.n | Mode.ALL_X.n, |
|
0o755); |
|
assert.strictEqual( |
|
Mode.USER_R.n | Mode.USER_W.n | Mode.USER_X.n | Mode.GROUP_R.n, |
|
0o740); |
Are there any enum names that are forbidden to use? Although most languages have a set of names that are reserved, I was thinking this module be exempt as it is not built into the language.
I had an issue using the enum name "length".
TypeError: Cannot redefine property: length at Function.defineProperty (native) at Function._pushEnumValue (/mnt/cfdata/home/dte/off_the_shelf_node_modules/node_modules/enumify/lib/enumify.js:145:
If there is a list of illegal values (reasonable if you ask me), please publish.
Thanks.