enumの内部でpropertyやmethodなど、一つのファイルで管理できるのが非常に良くてもう当たり前になっている
enum HogeType {
hoge('ほげ', list: ['ほげ', 'hoge']),
fuga('ふが', list: ['ふが', 'huga']),
piyo('ぴよ', list: ['ぴよ']),
foo('ふー', list: ['foo']),
bar('ばー'),
none('');
const HogeType(this.type, {this.list = const []});
final String type;
final List<String> list;
static HogeType fromIndex(int from) {
if (0 <= from && from < HogeType.values.length) return HogeType.values[from];
return HogeType.none;
}
static HogeType fromName(String? from) {
return HogeType.values.firstWhere(
(value) => value.name == from,
orElse: () => HogeType.none,
);
}
}
void hg() {
print(HogeType.fromName('hoge'));
//HogeType.hoge
print(HogeType.fromName('aa'));
//HogeType.none
print(HogeType.fromIndex(1));
//HogeType.fuga
print(HogeType.fromIndex(3));
//HogeType.foo
}
テストコードも書きました
import 'package:flutter_test/flutter_test.dart';
import 'package:saiteki/enum/hoge_type.dart';
void main() {
group('hogeをまとめた$HogeType >', () {
group('$intを入力した際に$HogeTypeを出力するMethod: fromIndex(${HogeType.fromIndex}) >', () {
test('(int 0)を入力した際に\${HogeType.hoge}を出力する', () {
expect(HogeType.fromIndex(0), HogeType.hoge);
});
test('(int 5)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromIndex(5), HogeType.none);
});
test('下限の境界値の一つ外側の値(int -1)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromIndex(-1), HogeType.none);
});
test('上限の境界値の一つ外側の値(int 6)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromIndex(6), HogeType.none);
});
});
});
group('$Stringを入力した際に$HogeTypeを出力するMethod: fromName(${HogeType.fromName}) >', () {
test('(String hoge)を入力した際に\${HogeType.hoge}を出力する', () {
expect(HogeType.fromName('hoge'), HogeType.hoge);
});
test('(String none)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromName('none'), HogeType.none);
});
test('対応外文字列の(String hogehoge)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromName('hogehoge'), HogeType.none);
});
test('文字列ではない(String? null)を入力した際に\${HogeType.none}を出力する', () {
expect(HogeType.fromName(null), HogeType.none);
});
});
}
おわり