summaryrefslogtreecommitdiff
path: root/uvim/src/testdir/test_vim9_enum.vim
diff options
context:
space:
mode:
authorMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-03 22:21:25 +0300
committerMehmet Samet Duman <yongdohyun@projecttick.org>2026-04-04 00:23:03 +0300
commit2eae5db069dc171f74cd863487655f6a88e5384d (patch)
tree2d9d05e09978a2a44acbfbb8d651f240df3ca052 /uvim/src/testdir/test_vim9_enum.vim
parent473d922faed49241a5d29d9e37dc4819cd512006 (diff)
downloadProject-Tick-2eae5db069dc171f74cd863487655f6a88e5384d.tar.gz
Project-Tick-2eae5db069dc171f74cd863487655f6a88e5384d.zip
NOISSUE rebrand vim to MNV's not Vim
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'uvim/src/testdir/test_vim9_enum.vim')
-rw-r--r--uvim/src/testdir/test_vim9_enum.vim1682
1 files changed, 0 insertions, 1682 deletions
diff --git a/uvim/src/testdir/test_vim9_enum.vim b/uvim/src/testdir/test_vim9_enum.vim
deleted file mode 100644
index be4c8f6d5b..0000000000
--- a/uvim/src/testdir/test_vim9_enum.vim
+++ /dev/null
@@ -1,1682 +0,0 @@
-" Test Vim9 enums
-
-import './util/vim9.vim' as v9
-
-" Test for parsing an enum definition
-def Test_enum_parse()
- # enum supported only in a Vim9 script
- var lines =<< trim END
- enum Foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1414: Enum can only be defined in Vim9 script', 1)
-
- # First character in an enum name should be capitalized.
- lines =<< trim END
- vim9script
- enum foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1415: Enum name must start with an uppercase letter: foo', 2)
-
- # Only alphanumeric characters are supported in an enum name
- lines =<< trim END
- vim9script
- enum Foo@bar
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1315: White space required after name: Foo@bar', 2)
-
- # Unsupported keyword (instead of enum)
- lines =<< trim END
- vim9script
- noenum Something
- endenum
- END
- v9.CheckSourceFailure(lines, 'E492: Not an editor command: noenum Something', 2)
-
- # Only the complete word "enum" should be recognized
- lines =<< trim END
- vim9script
- enums Something
- endenum
- END
- v9.CheckSourceFailure(lines, 'E492: Not an editor command: enums Something', 2)
-
- # The complete "enum" should be specified.
- lines =<< trim END
- vim9script
- enu Something
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: enu', 2)
-
- # The complete "endenum" should be specified.
- lines =<< trim END
- vim9script
- enum Something
- enden
- END
- v9.CheckSourceFailure(lines, 'E1065: Command cannot be shortened: enden', 3)
-
- # Only the complete word "endenum" should be recognized
- lines =<< trim END
- vim9script
- enum Something
- endenums
- END
- v9.CheckSourceFailure(lines, 'E1420: Missing :endenum', 4)
-
- # all lower case should be used for "enum"
- lines =<< trim END
- vim9script
- Enum Something
- endenum
- END
- v9.CheckSourceFailure(lines, 'E492: Not an editor command: Enum Something', 2)
-
- # all lower case should be used for "endenum"
- lines =<< trim END
- vim9script
- enum Something
- Endenum
- END
- v9.CheckSourceFailure(lines, 'E1420: Missing :endenum', 4)
-
- # Additional words after "endenum"
- lines =<< trim END
- vim9script
- enum Something
- endenum school's out
- END
- v9.CheckSourceFailure(lines, "E488: Trailing characters: school's out", 3)
-
- # Additional commands after "endenum"
- lines =<< trim END
- vim9script
- enum Something
- endenum | echo 'done'
- END
- v9.CheckSourceFailure(lines, "E488: Trailing characters: | echo 'done'", 3)
-
- # Try to define enum in a single command
- lines =<< trim END
- vim9script
- enum Something | endenum
- END
- v9.CheckSourceFailure(lines, 'E488: Trailing characters: | endenum', 2)
-
- # another command follows the enum name
- lines =<< trim END
- vim9script
- enum Something | var x = 10
- Foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E488: Trailing characters: | var x = 10', 2)
-
- # Try to define an enum with the same name as an existing variable
- lines =<< trim END
- vim9script
- var Something: list<number> = [1]
- enum Something
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1041: Redefining script item: "Something"', 3)
-
- # Unsupported special character following enum name
- lines =<< trim END
- vim9script
- enum Foo
- first,
- second : 20
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: : 20', 4)
-
- # Try initializing an enum item with a number
- lines =<< trim END
- vim9script
- enum Foo
- first,
- second = 2
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: = 2', 4)
-
- # Try initializing an enum item with a String
- lines =<< trim END
- vim9script
- enum Foo
- first,
- second = 'second'
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, "E1123: Missing comma before argument: = 'second'", 4)
-
- # Try initializing an enum item with a List
- lines =<< trim END
- vim9script
- enum Foo
- first,
- second = []
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: = []', 4)
-
- # Use a colon after name
- lines =<< trim END
- vim9script
- enum Foo
-
- # first
- first:
- second
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: :', 5)
-
- # Use a '=='
- lines =<< trim END
- vim9script
- enum Foo
- first == 1
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: == 1', 3)
-
- # Missing comma after an enum item
- lines =<< trim END
- vim9script
- enum Planet
- mercury
- venus
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1419: Not a valid command in an Enum: venus', 4)
-
- # Comma at the beginning of an item
- lines =<< trim END
- vim9script
- enum Planet
- mercury
- ,venus
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1419: Not a valid command in an Enum: ,venus', 4)
- # Space before comma
- lines =<< trim END
- vim9script
- enum Planet
- mercury ,
- venus
- endenum
- END
- v9.CheckSourceFailure(lines, "E1068: No white space allowed before ','", 3)
-
- # No space after comma
- lines =<< trim END
- vim9script
- enum Planet
- mercury,venus
- endenum
- END
- v9.CheckSourceFailure(lines, "E1069: White space required after ',': mercury,venus", 3)
-
- # no comma between items in the same line
- lines =<< trim END
- vim9script
- enum Planet
- mercury venus earth
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: venus earth', 3)
-
- # No space after an item and comment between items
- lines =<< trim END
- vim9script
- enum Planet
- mercury
-
- # Venus
- venus
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1419: Not a valid command in an Enum: venus', 6)
-
- # Comma is supported for the last item
- lines =<< trim END
- vim9script
- enum Planet
- mercury,
- venus,
- endenum
- var p: Planet
- p = Planet.mercury
- p = Planet.venus
- END
- v9.CheckSourceSuccess(lines)
-
- # invalid enum value declaration
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- $%@
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1418: Invalid enum value declaration: $%@', 4)
-
- # Duplicate enum value
- lines =<< trim END
- vim9script
- enum A
- Foo,
- Bar,
- Foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1428: Duplicate enum value: Foo', 5)
-
- # Duplicate enum value in the same line
- lines =<< trim END
- vim9script
- enum A
- Foo, Bar, Foo,
- Bar
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1428: Duplicate enum value: Foo', 3)
-
- # Try extending a class when defining an enum
- lines =<< trim END
- vim9script
- class Foo
- endclass
- enum Bar extends Foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1416: Enum cannot extend a class or enum', 4)
-
- # Try extending an enum
- lines =<< trim END
- vim9script
- enum Foo
- endenum
- enum Bar extends Foo
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1416: Enum cannot extend a class or enum', 4)
-
- # Try extending an enum using a class
- lines =<< trim END
- vim9script
- enum Foo
- endenum
- class Bar extends Foo
- endclass
- END
- v9.CheckSourceFailure(lines, 'E1354: Cannot extend Foo', 5)
-
- # Try implementing an enum using a class
- lines =<< trim END
- vim9script
- enum Foo
- endenum
- class Bar implements Foo
- endclass
- END
- v9.CheckSourceFailure(lines, 'E1347: Not a valid interface: Foo', 5)
-
- # abstract method is not supported in an enum
- lines =<< trim END
- vim9script
- enum Foo
- Apple
- abstract def Bar()
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1417: Abstract cannot be used in an Enum', 4)
-
- # Define an enum without any enum values but only with an object variable
- lines =<< trim END
- vim9script
- enum Foo
- final n: number = 10
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1123: Missing comma before argument: n: number = 10', 3)
-enddef
-
-def Test_basic_enum()
- # Declare a simple enum
- var lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- var a: Foo = Foo.apple
- var b: Foo = Foo.orange
- assert_equal(a, Foo.apple)
- assert_equal(b, Foo.orange)
- END
- v9.CheckSourceSuccess(lines)
-
- # Multiple enums in a single line
- lines =<< trim END
- vim9script
- enum Foo
- apple, orange
- endenum
- assert_equal('enum<Foo>', typename(Foo.apple))
- assert_equal('enum<Foo>', typename(Foo.orange))
- END
- v9.CheckSourceSuccess(lines)
-
- # Comments and empty lines are supported between enum items
- lines =<< trim END
- vim9script
- enum Foo
- # Apple
- apple,
-
- # Orange
- orange
- endenum
- def Fn()
- var a: Foo = Foo.apple
- var b: Foo = Foo.orange
- assert_equal(a, Foo.apple)
- assert_equal(b, Foo.orange)
- enddef
- END
- v9.CheckSourceSuccess(lines)
-
- # Try using a non-existing enum value
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- var a: Foo = Foo.pear
- END
- v9.CheckSourceFailure(lines, 'E1422: Enum value "pear" not found in enum "Foo"', 6)
-
- # Enum function argument
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- def Fn(a: Foo): Foo
- return a
- enddef
- assert_equal(Foo.apple, Fn(Foo.apple))
- END
- v9.CheckSourceSuccess(lines)
-
- # Enum function argument
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- def Fn(a: Foo): Foo
- return a
- enddef
- Fn({})
- END
- v9.CheckSourceFailure(lines, 'E1013: Argument 1: type mismatch, expected enum<Foo> but got dict<any>', 9)
-
- # Returning an enum in a function returning number
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- def Fn(): number
- return Foo.orange
- enddef
- Fn()
- END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected number but got enum<Foo>', 1)
-
- # Returning a number in a function returning enum
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- def Fn(): Foo
- return 20
- enddef
- Fn()
- END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected enum<Foo> but got number', 1)
-
- # Use a List of enums
- lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus,
- Earth
- endenum
- var l1: list<Planet> = [Planet.Mercury, Planet.Venus]
- assert_equal(Planet.Venus, l1[1])
- def Fn()
- var l2: list<Planet> = [Planet.Mercury, Planet.Venus]
- assert_equal(Planet.Venus, l2[1])
- enddef
- END
- v9.CheckSourceSuccess(lines)
-
- # Try using an enum as a value
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- endenum
- var a = Fruit
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Fruit" cannot be used as a value', 6)
-enddef
-
-" Test for type() and typename() of an enum
-def Test_enum_type()
- var lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- endenum
- assert_equal('enum<Fruit>', typename(Fruit))
- assert_equal('enum<Fruit>', typename(Fruit.Apple))
- assert_equal(v:t_enum, type(Fruit))
- assert_equal(v:t_enumvalue, type(Fruit.Apple))
- assert_equal(15, type(Fruit))
- assert_equal(16, type(Fruit.Apple))
- END
- v9.CheckSourceSuccess(lines)
-
- # Assign an enum to a variable with any type
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- endenum
- var a = Fruit.Apple
- var b: any = Fruit.Orange
- assert_equal('enum<Fruit>', typename(a))
- assert_equal('enum<Fruit>', typename(b))
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Try modifying an enum or an enum item
-def Test_enum_modify()
- # Try assigning an unsupported value to an enum
- var lines =<< trim END
- vim9script
- enum Foo
- apple
- endenum
- var a: Foo = 30
- END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected enum<Foo> but got number', 5)
-
- # Try assigning an unsupported value to an enum in a function
- lines =<< trim END
- vim9script
- enum Foo
- apple
- endenum
- def Fn()
- var a: Foo = 30
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected enum<Foo> but got number', 1)
-
- # Try assigning a number to an enum
- lines =<< trim END
- vim9script
- enum Foo
- apple,
- orange
- endenum
- Foo = 10
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Foo" cannot be used as a value', 6)
-
- # Try assigning a number to an enum in a function
- lines =<< trim END
- vim9script
- enum Foo
- apple
- endenum
- def Fn()
- Foo = 10
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected enum<Foo> but got number', 1)
-
- # Try assigning a number to an enum value
- lines =<< trim END
- vim9script
- enum Foo
- apple
- endenum
- Foo.apple = 20
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Foo.apple" cannot be modified', 5)
-
- # Try assigning a number to an enum value in a function
- lines =<< trim END
- vim9script
- enum Foo
- apple
- endenum
- def Fn()
- Foo.apple = 20
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Foo.apple" cannot be modified', 1)
-
- # Try assigning one enum to another
- lines =<< trim END
- vim9script
- enum Foo
- endenum
- enum Bar
- endenum
- Foo = Bar
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Bar" cannot be used as a value', 6)
-
- # Try assigning one enum to another in a function
- lines =<< trim END
- vim9script
- enum Foo
- endenum
- enum Bar
- endenum
- def Fn()
- Foo = Bar
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Bar" cannot be used as a value', 1)
-
- # Try assigning one enum item to another enum item
- lines =<< trim END
- vim9script
- enum Foo
- Apple
- endenum
- enum Bar
- Orange
- endenum
- Foo.Apple = Bar.Orange
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Foo.Apple" cannot be modified', 8)
-
- # Try assigning one enum item to another enum item in a function
- lines =<< trim END
- vim9script
- enum Foo
- Apple
- endenum
- enum Bar
- Orange
- endenum
- def Fn()
- Foo.Apple = Bar.Orange
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Foo.Apple" cannot be modified', 1)
-enddef
-
-" Test for using enum in an expression
-def Test_enum_expr()
- var lines =<< trim END
- vim9script
- enum Color
- Red, Blue, Green
- endenum
- var a: number = 1 + Color
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Color" cannot be used as a value', 5)
-
- lines =<< trim END
- vim9script
- enum Color
- Red, Blue, Green
- endenum
- var a: number = 1 + Color.Red
- END
- v9.CheckSourceFailure(lines, 'E1424: Using an Enum "Color" as a Number', 5)
-
- lines =<< trim END
- vim9script
- enum Color
- Red, Blue, Green
- endenum
- var s: string = "abc" .. Color
- END
- v9.CheckSourceFailure(lines, 'E1421: Enum "Color" cannot be used as a value', 5)
-
- lines =<< trim END
- vim9script
- enum Color
- Red, Blue, Green
- endenum
- var s: string = "abc" .. Color.Red
- END
- v9.CheckSourceFailure(lines, 'E1425: Using an Enum "Color" as a String', 5)
-enddef
-
-" Using an enum in a lambda function
-def Test_enum_lambda()
- var lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus,
- Earth,
- endenum
- var Fn = (p: Planet): Planet => p
- for [idx, v] in items([Planet.Mercury, Planet.Venus, Planet.Earth])
- assert_equal(idx, Fn(v).ordinal)
- endfor
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Comparison using enums
-def Test_enum_compare()
- var lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus,
- Earth,
- endenum
- enum Fruit
- Apple,
- Orange
- endenum
-
- var p: Planet = Planet.Venus
- var f: Fruit = Fruit.Orange
- assert_equal(true, p == Planet.Venus)
- assert_equal(false, p == Planet.Earth)
- assert_equal(false, p == f)
- assert_equal(true, Planet.Mercury == Planet.Mercury)
- assert_equal(true, Planet.Venus != Planet.Earth)
- assert_equal(true, Planet.Mercury != Fruit.Apple)
-
- def Fn1()
- var p2: Planet = Planet.Venus
- var f2: Fruit = Fruit.Orange
- assert_equal(true, p2 == Planet.Venus)
- assert_equal(false, p2 == Planet.Earth)
- assert_equal(false, p2 == f2)
- enddef
- Fn1()
-
- # comparison using "is" and "isnot"
- assert_equal(true, p is Planet.Venus)
- assert_equal(true, p isnot Planet.Earth)
- assert_equal(false, p is Fruit.Orange)
- assert_equal(true, p isnot Fruit.Orange)
- def Fn2(arg: Planet)
- assert_equal(true, arg is Planet.Venus)
- assert_equal(true, arg isnot Planet.Earth)
- assert_equal(false, arg is Fruit.Orange)
- assert_equal(true, arg isnot Fruit.Orange)
- enddef
- Fn2(p)
-
- class A
- endclass
- var o: A = A.new()
- assert_equal(false, p == o)
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for using an enum as a default argument to a function
-def Test_enum_default_arg()
- var lines =<< trim END
- vim9script
- enum Day
- Monday, Tuesday, Wednesday
- endenum
- def Fn(d: Day = Day.Tuesday): Day
- return d
- enddef
- assert_equal(Day.Tuesday, Fn())
- assert_equal(Day.Wednesday, Fn(Day.Wednesday))
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for enum garbage collection
-func Test_enum_garbagecollect()
- let lines =<< trim END
- vim9script
- enum Car
- Honda, Ford, Tesla
- endenum
- assert_equal(1, Car.Ford.ordinal)
- call test_garbagecollect_now()
- assert_equal(1, Car.Ford.ordinal)
- var c: Car = Car.Tesla
- assert_equal(2, c.ordinal)
- call test_garbagecollect_now()
- assert_equal(2, c.ordinal)
- END
- call v9.CheckSourceSuccess(lines)
-
- " garbage collection with a variable of type any
- let lines =<< trim END
- vim9script
- enum Car
- Honda, Ford, Tesla
- endenum
- call test_garbagecollect_now()
- var c: any = Car.Tesla
- call test_garbagecollect_now()
- assert_equal(Car.Tesla, c)
- END
- call v9.CheckSourceSuccess(lines)
-
- " garbage collection with function arguments and return types
- let lines =<< trim END
- vim9script
- enum Car
- Honda, Ford, Tesla
- endenum
- def Fn(a: Car): Car
- assert_equal(Car.Ford, a)
- return Car.Tesla
- enddef
- call test_garbagecollect_now()
- var b: Car = Car.Ford
- call test_garbagecollect_now()
- assert_equal(Car.Tesla, Fn(b))
- call test_garbagecollect_now()
- END
- call v9.CheckSourceSuccess(lines)
-endfunc
-
-" Test for the enum values class variable
-def Test_enum_values()
- var lines =<< trim END
- vim9script
- enum Car
- Honda, Ford, Tesla
- endenum
- var l: list<Car> = Car.values
- assert_equal(Car.Ford, l[1])
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum Car
- Honda,
- Ford,
- endenum
- assert_equal([Car.Honda, Car.Ford], Car.values)
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum Car
- Honda, Ford,
- endenum
- assert_equal([Car.Honda, Car.Ford], Car.values)
- END
- v9.CheckSourceSuccess(lines)
-
- # empty enum
- lines =<< trim END
- vim9script
- enum Car
- endenum
- assert_equal([], Car.values)
- END
- v9.CheckSourceSuccess(lines)
-
- # single value
- lines =<< trim END
- vim9script
- enum Car
- Honda
- endenum
- assert_equal([Car.Honda], Car.values)
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum A
- Red,
- Blue
- static def GetValues(): list<A>
- return values
- enddef
- endenum
- assert_equal([A.Red, A.Blue], A.GetValues())
- END
- v9.CheckSourceSuccess(lines)
-
- # Other class variables in an enum should not be added to 'values'
- lines =<< trim END
- vim9script
- enum LogLevel
- Error, Warn
- static const x: number = 22
- endenum
- assert_equal([LogLevel.Error, LogLevel.Warn], LogLevel.values)
- END
- v9.CheckSourceSuccess(lines)
-
- # Other class variable of enum type should not be added to 'values'
- lines =<< trim END
- vim9script
- enum LogLevel
- Error, Warn
- static const x: LogLevel = LogLevel.Warn
- endenum
- assert_equal([LogLevel.Error, LogLevel.Warn], LogLevel.values)
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test comments in enums
-def Test_enum_comments()
- var lines =<< trim END
- vim9script
- enum Car # cars
- # before enum
- Honda, # honda
- # before enum
- Ford # ford
- endenum
- assert_equal(1, Car.Ford.ordinal)
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum Car # cars
- # before enum
- Honda(), # honda
- # before enum
- Ford() # ford
- endenum
- assert_equal(1, Car.Ford.ordinal)
- END
- v9.CheckSourceSuccess(lines)
-
- # Test for using an unsupported comment
- lines =<< trim END
- vim9script
- enum Car
- Honda,
- Ford,
- #{
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1170: Cannot use #{ to start a comment', 4)
-enddef
-
-" Test trailing whitespace after enum values
-def Test_enum_whitespace()
- var lines =<< trim END
- vim9script
- enum Car
- Honda,
- Ford
- endenum
- defcompile
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum Car
- Honda(),
- Ford()
- endenum
- defcompile
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test string() with enums
-def Test_enum_string()
- var lines =<< trim END
- vim9script
- enum Car
- Honda,
- Ford
- endenum
- assert_equal("enum Car", string(Car))
- assert_equal("enum Car.Honda {name: 'Honda', ordinal: 0}", string(Car.Honda))
- END
- v9.CheckSourceSuccess(lines)
-
- # customized string function
- lines =<< trim END
- vim9script
- enum Dir
- North,
- South
-
- def string(): string
- return $'Dir.{this.name}'
- enddef
- endenum
- assert_equal('Dir.North', string(Dir.North))
- assert_equal('Dir.South', string(Dir.South))
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for importing an enum
-def Test_enum_import()
- var lines =<< trim END
- vim9script
- export enum Star
- Gemini,
- Orion,
- Pisces
- endenum
- END
- writefile(lines, 'Xenumexport.vim', 'D')
-
- lines =<< trim END
- vim9script
- import './Xenumexport.vim' as mod
-
- var s1: mod.Star = mod.Star.Orion
- assert_equal(true, s1 == mod.Star.Orion)
- assert_equal(2, mod.Star.Pisces.ordinal)
- var l1: list<mod.Star> = mod.Star.values
- assert_equal("enum Star.Orion {name: 'Orion', ordinal: 1}", string(l1[1]))
- assert_equal(s1, l1[1])
-
- def Fn()
- var s2: mod.Star = mod.Star.Orion
- assert_equal(true, s2 == mod.Star.Orion)
- assert_equal(2, mod.Star.Pisces.ordinal)
- var l2: list<mod.Star> = mod.Star.values
- assert_equal("enum Star.Orion {name: 'Orion', ordinal: 1}", string(l2[1]))
- assert_equal(s2, l2[1])
- enddef
- Fn()
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Test for using test_refcount() with enum
-def Test_enum_refcount()
- var lines =<< trim END
- vim9script
- enum Foo
- endenum
- assert_equal(1, test_refcount(Foo))
-
- enum Star
- Gemini,
- Orion
- endenum
- assert_equal(3, test_refcount(Star))
- assert_equal(2, test_refcount(Star.Gemini))
- assert_equal(2, test_refcount(Star.Orion))
-
- var s: Star
- assert_equal(3, test_refcount(Star))
- assert_equal(-1, test_refcount(s))
- s = Star.Orion
- assert_equal(3, test_refcount(Star))
- assert_equal(3, test_refcount(s))
- assert_equal(2, test_refcount(Star.Gemini))
- var t = s
- assert_equal(3, test_refcount(Star))
- assert_equal(4, test_refcount(s))
- assert_equal(4, test_refcount(Star.Orion))
- END
- v9.CheckSourceSuccess(lines)
-
- lines =<< trim END
- vim9script
- enum Star
- Gemini,
- Orion,
- endenum
-
- assert_equal(3, test_refcount(Star))
- assert_equal(2, test_refcount(Star.Gemini))
- assert_equal(2, test_refcount(Star.Orion))
-
- var x = [Star.Gemini]
- assert_equal(3, test_refcount(Star))
- assert_equal(3, test_refcount(Star.Gemini))
-
- def Fn()
- var y = [Star.Gemini, Star.Orion]
- assert_equal(6, test_refcount(Star))
- assert_equal(4, test_refcount(Star.Gemini))
- enddef
- Fn()
- # The instruction in the compiled function adds an additional reference
- # to the enum.
- assert_equal(6, test_refcount(Star))
- assert_equal(3, test_refcount(Star.Gemini))
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for defining an enum with additional object variables and methods
-def Test_enum_enhanced()
- var lines =<< trim END
- vim9script
- enum Vehicle
- car(4, 5, 400),
- bus(6, 50, 800),
- bicycle(2, 1, 0)
-
- final tires: number
- final passengers: number
- final carbonPerKilometer: number
-
- def new(t: number, p: number, cpk: number)
- this.tires = t
- this.passengers = p
- this.carbonPerKilometer = cpk
- enddef
-
- def CarbonFootprint(): float
- return round(this.carbonPerKilometer / this.passengers)
- enddef
-
- def IsTwoWheeled(): bool
- return this == Vehicle.bicycle
- enddef
-
- def CompareTo(other: Vehicle): float
- return this.CarbonFootprint() - other.CarbonFootprint()
- enddef
- endenum
-
- var v: Vehicle = Vehicle.bus
- assert_equal([6, 50, 800], [v.tires, v.passengers, v.carbonPerKilometer])
- assert_equal(true, Vehicle.bicycle.IsTwoWheeled())
- assert_equal(false, Vehicle.car.IsTwoWheeled())
- assert_equal(16.0, Vehicle.bus.CarbonFootprint())
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for the enum value 'name' variable
-def Test_enum_name()
- # Check the names of enum values
- var lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus,
- Earth
- endenum
- assert_equal('Mercury', Planet.Mercury.name)
- assert_equal('Venus', Planet.Venus.name)
- assert_equal('Earth', Planet.Earth.name)
- assert_equal('string', typename(Planet.Earth.name))
- END
- v9.CheckSourceSuccess(lines)
-
- # Check the name of enum items in the constructor
- lines =<< trim END
- vim9script
- enum Planet
- Mercury("Mercury"),
- Venus("Venus"),
- Earth("Earth")
-
- def new(s: string)
- assert_equal(s, this.name)
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceSuccess(lines)
-
- # Try assigning to the name of an enum
- lines =<< trim END
- vim9script
- enum Fruit
- Apple
- endenum
- Fruit.Apple.name = 'foo'
- END
- v9.CheckSourceFailure(lines, 'E1335: Variable "name" in class "Fruit" is not writable', 5)
-
- # Try assigning to the name of an enum in a function
- lines =<< trim END
- vim9script
- enum Fruit
- Apple
- endenum
- def Fn()
- Fruit.Apple.name = 'bar'
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Fruit.name" cannot be modified', 1)
-
- # Try to overwrite an enum value name in the enum constructor
- lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus
-
- def new()
- this.name = 'foo'
- enddef
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1427: Enum "Planet" name cannot be modified', 1)
-
- # Try to declare an object variable named 'name'
- lines =<< trim END
- vim9script
- enum Planet
- Mercury
- var name: string
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: name', 4)
-enddef
-
-" Test for the enum value 'ordinal' variable
-def Test_enum_ordinal()
- # Check the ordinal values of enum items
- var lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus,
- Earth
- endenum
- assert_equal(0, Planet.Mercury.ordinal)
- assert_equal(1, Planet.Venus.ordinal)
- assert_equal(2, Planet.Earth.ordinal)
- assert_equal('number', typename(Planet.Earth.ordinal))
- END
- v9.CheckSourceSuccess(lines)
-
- # Check the ordinal value of enum items in the constructor
- lines =<< trim END
- vim9script
- enum Planet
- Mercury(0),
- Venus(1),
- Earth(2)
-
- def new(v: number)
- assert_equal(v, this.ordinal)
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceSuccess(lines)
-
- # Try assigning to the ordinal value of an enum
- lines =<< trim END
- vim9script
- enum Fruit
- Apple
- endenum
- Fruit.Apple.ordinal = 20
- END
- v9.CheckSourceFailure(lines, 'E1335: Variable "ordinal" in class "Fruit" is not writable', 5)
-
- # Try assigning to the ordinal value of an enum in a function
- lines =<< trim END
- vim9script
- enum Fruit
- Apple
- endenum
- def Fn()
- Fruit.Apple.ordinal = 20
- enddef
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E1423: Enum value "Fruit.ordinal" cannot be modified', 1)
-
- # Try to overwrite an enum value ordinal in the enum constructor
- lines =<< trim END
- vim9script
- enum Planet
- Mercury,
- Venus
-
- def new()
- this.ordinal = 20
- enddef
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1426: Enum "Planet" ordinal value cannot be modified', 1)
-
- # Try to declare an object variable named 'ordinal'
- lines =<< trim END
- vim9script
- enum Planet
- Mercury
- var ordinal: number
- endenum
- END
- v9.CheckSourceFailure(lines, 'E1369: Duplicate variable: ordinal', 4)
-enddef
-
-" Test for trying to create a new enum object using the constructor
-def Test_enum_invoke_constructor()
- var lines =<< trim END
- vim9script
- enum Foo
- endenum
- var f: Foo = Foo.new()
- END
- v9.CheckSourceFailure(lines, 'E1325: Method "new" not found in class "Foo"', 4)
-
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- endenum
- var f: Fruit = Fruit.new()
- END
- v9.CheckSourceFailure(lines, 'E1325: Method "new" not found in class "Fruit"', 6)
-
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- def newFruit()
- enddef
- endenum
- var f: Fruit = Fruit.newFruit()
- END
- v9.CheckSourceFailure(lines, 'E1325: Method "newFruit" not found in class "Fruit"', 8)
-
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
- endenum
- def Fn()
- var f: Fruit = Fruit.new()
- enddef
- Fn()
- END
- v9.CheckSourceFailure(lines, 'E1325: Method "new" not found in class "Fruit"', 1)
-
- # error in the enum constructor
- lines =<< trim END
- vim9script
- enum Planet
- earth
- def new()
- x = 123
- enddef
- endenum
- END
- v9.CheckSourceFailureList(lines, ['E1100:', 'E1100:'], 1)
-enddef
-
-" Test for checking "this" in an enum constructor
-def Test_enum_this_in_constructor()
- var lines =<< trim END
- vim9script
- enum A
- Red("enum A.Red {name: 'Red', ordinal: 0}"),
- Blue("enum A.Blue {name: 'Blue', ordinal: 1}"),
- Green("enum A.Green {name: 'Green', ordinal: 2}")
-
- def new(s: string)
- assert_equal(s, string(this))
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for using member variables in an enum object
-def Test_enum_object_variable()
- var lines =<< trim END
- vim9script
- enum Planet
- Jupiter(95),
- Saturn(146)
-
- var moons: number
- endenum
- assert_equal(95, Planet.Jupiter.moons)
- assert_equal(146, Planet.Saturn.moons)
- END
- v9.CheckSourceSuccess(lines)
-
- # Use a final object variable
- lines =<< trim END
- vim9script
- enum Planet
- Jupiter(95),
- Saturn(146)
-
- final moons: number
- def new(n: number)
- this.moons = n
- enddef
- endenum
- assert_equal(95, Planet.Jupiter.moons)
- assert_equal(146, Planet.Saturn.moons)
- END
- v9.CheckSourceSuccess(lines)
-
- # Use a const object variable
- lines =<< trim END
- vim9script
- enum Planet
- Mars(false),
- Jupiter(true)
-
- const has_ring: bool
- def new(r: bool)
- this.has_ring = r
- enddef
- endenum
- assert_equal(false, Planet.Mars.has_ring)
- assert_equal(true, Planet.Jupiter.has_ring)
- END
- v9.CheckSourceSuccess(lines)
-
- # Use a regular object variable
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
-
- final farm: string = 'SunValley'
- endenum
- assert_equal('SunValley', Fruit.Apple.farm)
- assert_equal('SunValley', Fruit.Apple.farm)
- END
- v9.CheckSourceSuccess(lines)
-
- # Invoke the default constructor with an object variable
- lines =<< trim END
- vim9script
- enum Fruit
- Apple('foo'),
- Orange('bar')
-
- final t: string
- endenum
- assert_equal('foo', Fruit.Apple.t)
- assert_equal('bar', Fruit.Orange.t)
- END
- v9.CheckSourceSuccess(lines)
-
- # Invoke the default constructor with an argument but without the object
- # variable
- lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange('bar')
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E118: Too many arguments for function: new', 5)
-
- # Define a default constructor with an argument, but don't pass it in when
- # defining the enum value
- lines =<< trim END
- vim9script
- enum Fruit
- Apple(5),
- Orange
-
- def new(t: number)
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, 'E119: Not enough arguments for function: new', 8)
-enddef
-
-" Test for using a custom constructor with an enum
-def Test_enum_custom_constructor()
- # space before "("
- var lines =<< trim END
- vim9script
- enum Fruit
- Apple(10),
- Orange (20)
-
- def new(t: number)
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, "E1068: No white space allowed before '(': Orange (20)", 4)
-
- # no closing ")"
- lines =<< trim END
- vim9script
- enum Fruit
- Apple(10),
- Orange (20
-
- def new(t: number)
- enddef
- endenum
- defcompile
- END
- v9.CheckSourceFailure(lines, "E1068: No white space allowed before '(': Orange (20", 4)
-
- # Specify constructor arguments split across multiple lines
- lines =<< trim END
- vim9script
- enum Fruit
- Apple(10,
- 'foo'), Orange(20,
- 'bar'),
- Pear(30,
- 'baz'), Mango(40,
- 'qux')
-
- final n: number
- final s: string
- def new(t: number, str: string)
- this.n = t
- this.s = str
- enddef
- endenum
- defcompile
- assert_equal([10, 'foo'], [Fruit.Apple.n, Fruit.Apple.s])
- assert_equal([20, 'bar'], [Fruit.Orange.n, Fruit.Orange.s])
- assert_equal([30, 'baz'], [Fruit.Pear.n, Fruit.Pear.s])
- assert_equal([40, 'qux'], [Fruit.Mango.n, Fruit.Mango.s])
- END
- v9.CheckSourceSuccess(lines)
-
- # specify multiple enums with constructor arguments in a single line
- lines =<< trim END
- vim9script
- enum Fruit
- Apple(10, 'foo'), Orange(20, 'bar'), Pear(30, 'baz'), Mango(40, 'qux')
- const n: number
- const s: string
- endenum
- defcompile
- assert_equal([10, 'foo'], [Fruit.Apple.n, Fruit.Apple.s])
- assert_equal([20, 'bar'], [Fruit.Orange.n, Fruit.Orange.s])
- assert_equal([30, 'baz'], [Fruit.Pear.n, Fruit.Pear.s])
- assert_equal([40, 'qux'], [Fruit.Mango.n, Fruit.Mango.s])
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for using class variables in an enum class
-def Test_enum_class_variable()
- var lines =<< trim END
- vim9script
- enum Fruit
- Apple,
- Orange
-
- static var farm: string = 'SunValley'
- endenum
- assert_equal('SunValley', Fruit.farm)
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for converting a string to an enum value
-def Test_enum_eval()
- var lines =<< trim END
- vim9script
- enum Color
- Red,
- Blue
- endenum
- var e = eval('Color.Blue')
- assert_equal(Color.Blue, e)
- assert_equal(1, e.ordinal)
- assert_fails("eval('Color.Green')", 'E1422: Enum value "Green" not found in enum "Color"')
- assert_fails("var x = eval('Color')", 'E1421: Enum "Color" cannot be used as a value')
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for using "values" in an enum class variable
-def Test_use_enum_values_in_class_variable()
- var lines =<< trim END
- vim9script
- enum Dir
- North, South
- static const dirs: list<Dir> = Dir.values
- endenum
- assert_equal([Dir.North, Dir.South], Dir.dirs)
- END
- v9.CheckSourceSuccess(lines)
-enddef
-
-" Test for using lambda block in enums
-def Test_lambda_block_in_enum()
- # This used to crash Vim
- var lines =<< trim END
- vim9script
- enum IdEnum1
- ID1
- const Id: func(number): number = (num: number): number => {
- # Return a ID
- return num / 2
- }
- endenum
- assert_equal(5, IdEnum1.ID1.Id(10))
- END
- v9.CheckScriptSuccess(lines)
-
- # This used to crash Vim
- lines =<< trim END
- vim9script
- enum IdEnum2
- ID1
- static const Id: func(number): number = (num: number): number => {
- # Return a ID
- return num + 2
- }
- endenum
- assert_equal(12, IdEnum2.Id(10))
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Echo an enum
-def Test_enum_echo()
- var lines =<< trim END
- vim9script
- enum Demo
- one('tahi'),
- two('rua'),
- three('toru')
- var alias: string
- endenum
- assert_equal('enum Demo.one {name: one, ordinal: 0, alias: tahi}', execute('echo Demo.one')->split("\n")[0])
- END
- v9.CheckScriptSuccess(lines)
-enddef
-
-" Test for garbage collecting an enum with a complex member variables.
-func Test_class_selfref_gc()
- let lines =<< trim END
- vim9script
- enum Foo
- Red,
- Blue
- static var d = {a: [1, 2]}
- static var l = [{a: 'a', b: 'b'}]
- endenum
- assert_equal(3, test_refcount(Foo))
- test_garbagecollect_now()
- assert_equal(3, test_refcount(Foo))
- END
- call v9.CheckSourceSuccess(lines)
-endfunc
-
-" Test for defining an enum in a function
-def Test_enum_defined_in_function()
- var lines =<< trim END
- vim9script
- def Fn()
- var x = 1
- enum Foo
- Red,
- endenum
- enddef
- defcompile
- END
- v9.CheckScriptFailure(lines, 'E1435: Enum can only be used in a script', 2)
-enddef
-
-" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker