@wq2/brigadier-ts 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/README.md +1 -0
  2. package/dist/Command.d.ts +1 -1
  3. package/dist/CommandDispatcher.d.ts +1 -1
  4. package/dist/CommandDispatcher.js +231 -357
  5. package/dist/ParseResults.d.ts +1 -1
  6. package/dist/ParseResults.js +9 -10
  7. package/dist/StringReader.d.ts +1 -1
  8. package/dist/StringReader.js +75 -77
  9. package/dist/arguments/ArgumentType.d.ts +1 -1
  10. package/dist/arguments/ArgumentType.js +9 -8
  11. package/dist/arguments/BoolArgumentType.d.ts +5 -1
  12. package/dist/arguments/BoolArgumentType.js +9 -27
  13. package/dist/arguments/FloatArgumentType.d.ts +1 -1
  14. package/dist/arguments/FloatArgumentType.js +11 -30
  15. package/dist/arguments/IntegerArgumentType.d.ts +1 -1
  16. package/dist/arguments/IntegerArgumentType.js +11 -30
  17. package/dist/arguments/LongArgumentType.d.ts +3 -3
  18. package/dist/arguments/LongArgumentType.js +13 -32
  19. package/dist/arguments/NumberArgumentType.d.ts +2 -2
  20. package/dist/arguments/NumberArgumentType.js +15 -33
  21. package/dist/arguments/StringArgumentType.d.ts +1 -1
  22. package/dist/arguments/StringArgumentType.js +11 -29
  23. package/dist/builder/ArgumentBuilder.d.ts +1 -1
  24. package/dist/builder/ArgumentBuilder.js +31 -71
  25. package/dist/builder/LiteralArgumentBuilder.js +14 -33
  26. package/dist/builder/RequiredArgumentBuilder.d.ts +1 -1
  27. package/dist/builder/RequiredArgumentBuilder.js +18 -37
  28. package/dist/context/CommandContext.d.ts +1 -1
  29. package/dist/context/CommandContext.js +31 -32
  30. package/dist/context/CommandContextBuilder.d.ts +1 -1
  31. package/dist/context/CommandContextBuilder.js +47 -50
  32. package/dist/context/ParsedArgument.js +8 -9
  33. package/dist/context/ParsedCommandNode.d.ts +1 -1
  34. package/dist/context/ParsedCommandNode.js +7 -8
  35. package/dist/context/StringRange.js +17 -18
  36. package/dist/context/SuggestionContext.d.ts +1 -1
  37. package/dist/context/SuggestionContext.js +3 -4
  38. package/dist/exceptions/CommandErrorType.d.ts +3 -3
  39. package/dist/exceptions/CommandErrorType.js +10 -19
  40. package/dist/exceptions/CommandSyntaxError.js +36 -54
  41. package/dist/suggestion/Suggestion.d.ts +1 -1
  42. package/dist/suggestion/Suggestion.js +16 -17
  43. package/dist/suggestion/Suggestions.d.ts +1 -1
  44. package/dist/suggestion/Suggestions.js +28 -30
  45. package/dist/suggestion/SuggestionsBuilder.d.ts +1 -1
  46. package/dist/suggestion/SuggestionsBuilder.js +22 -23
  47. package/dist/tree/ArgumentCommandNode.d.ts +1 -1
  48. package/dist/tree/ArgumentCommandNode.js +22 -40
  49. package/dist/tree/CommandNode.d.ts +1 -1
  50. package/dist/tree/CommandNode.js +28 -29
  51. package/dist/tree/LiteralCommandNode.d.ts +1 -1
  52. package/dist/tree/LiteralCommandNode.js +28 -41
  53. package/dist/tree/RootCommandNode.d.ts +1 -1
  54. package/dist/tree/RootCommandNode.js +17 -69
  55. package/jest.config.js +5 -5
  56. package/package.json +32 -32
  57. package/src/Command.ts +2 -1
  58. package/src/CommandDispatcher.ts +397 -295
  59. package/src/ParseResults.ts +26 -22
  60. package/src/StringReader.ts +212 -193
  61. package/src/arguments/ArgumentType.ts +13 -8
  62. package/src/arguments/BoolArgumentType.ts +22 -21
  63. package/src/arguments/FloatArgumentType.ts +13 -14
  64. package/src/arguments/IntegerArgumentType.ts +13 -14
  65. package/src/arguments/LongArgumentType.ts +16 -17
  66. package/src/arguments/NumberArgumentType.ts +48 -38
  67. package/src/arguments/StringArgumentType.ts +26 -26
  68. package/src/builder/ArgumentBuilder.ts +80 -75
  69. package/src/builder/LiteralArgumentBuilder.ts +31 -21
  70. package/src/builder/RequiredArgumentBuilder.ts +42 -32
  71. package/src/context/CommandContext.ts +99 -76
  72. package/src/context/CommandContextBuilder.ts +169 -143
  73. package/src/context/ParsedArgument.ts +13 -13
  74. package/src/context/ParsedCommandNode.ts +14 -14
  75. package/src/context/StringRange.ts +26 -26
  76. package/src/context/SuggestionContext.ts +7 -7
  77. package/src/exceptions/CommandErrorType.ts +20 -13
  78. package/src/exceptions/CommandSyntaxError.ts +78 -37
  79. package/src/index.ts +30 -30
  80. package/src/suggestion/Suggestion.ts +46 -46
  81. package/src/suggestion/Suggestions.ts +59 -57
  82. package/src/suggestion/SuggestionsBuilder.ts +59 -57
  83. package/src/tree/ArgumentCommandNode.ts +51 -40
  84. package/src/tree/CommandNode.ts +96 -87
  85. package/src/tree/LiteralCommandNode.ts +78 -57
  86. package/src/tree/RootCommandNode.ts +33 -23
  87. package/test/Arguments.test.ts +47 -33
  88. package/test/CommandDispatcher.test.ts +18 -22
  89. package/test/StringReader.test.ts +47 -47
  90. package/tsconfig.json +9 -14
@@ -1,105 +1,114 @@
1
1
  import {
2
- StringReader,
3
- Command,
4
- LiteralCommandNode,
5
- ArgumentCommandNode,
6
- CommandContext,
7
- CommandContextBuilder,
8
- Predicate,
9
- RedirectModifier,
10
- SuggestionsBuilder,
11
- Suggestions
12
- } from '..';
2
+ type StringReader,
3
+ type Command,
4
+ LiteralCommandNode,
5
+ ArgumentCommandNode,
6
+ type CommandContext,
7
+ type CommandContextBuilder,
8
+ type Predicate,
9
+ type RedirectModifier,
10
+ type SuggestionsBuilder,
11
+ type Suggestions,
12
+ } from "..";
13
13
 
14
14
  export abstract class CommandNode<S> {
15
- private children: Map<string, CommandNode<S>>;
16
- private literals: Map<string, LiteralCommandNode<S>>;
17
- private arguments: Map<string, ArgumentCommandNode<S, any>>;
18
- private command: Command<S>;
19
- private requirement: Predicate<S>;
20
- private redirect: CommandNode<S>;
21
- private modifier: RedirectModifier<S>;
22
- private forks: boolean;
15
+ private children: Map<string, CommandNode<S>>;
16
+ private literals: Map<string, LiteralCommandNode<S>>;
17
+ private arguments: Map<string, ArgumentCommandNode<S, any>>;
18
+ private command: Command<S>;
19
+ private requirement: Predicate<S>;
20
+ private redirect: CommandNode<S>;
21
+ private modifier: RedirectModifier<S>;
22
+ private forks: boolean;
23
23
 
24
- constructor(command: Command<S>, requirement: Predicate<S>, redirect: CommandNode<S>, modifier: RedirectModifier<S>, forks: boolean) {
25
- this.children = new Map();
26
- this.literals = new Map();
27
- this.arguments = new Map();
28
- this.command = command;
29
- this.requirement = requirement;
30
- this.redirect = redirect;
31
- this.modifier = modifier;
32
- this.forks = forks;
33
- }
24
+ constructor(
25
+ command: Command<S>,
26
+ requirement: Predicate<S>,
27
+ redirect: CommandNode<S>,
28
+ modifier: RedirectModifier<S>,
29
+ forks: boolean,
30
+ ) {
31
+ this.children = new Map();
32
+ this.literals = new Map();
33
+ this.arguments = new Map();
34
+ this.command = command;
35
+ this.requirement = requirement;
36
+ this.redirect = redirect;
37
+ this.modifier = modifier;
38
+ this.forks = forks;
39
+ }
34
40
 
35
- getCommand(): Command<S> {
36
- return this.command;
37
- }
41
+ getCommand(): Command<S> {
42
+ return this.command;
43
+ }
38
44
 
39
- getChildren(): CommandNode<S>[] {
40
- return Array.from(this.children.values());
41
- }
45
+ getChildren(): CommandNode<S>[] {
46
+ return Array.from(this.children.values());
47
+ }
42
48
 
43
- getChild(name: string): CommandNode<S> {
44
- return this.children.get(name);
45
- }
49
+ getChild(name: string): CommandNode<S> {
50
+ return this.children.get(name);
51
+ }
46
52
 
47
- getRedirect(): CommandNode<S> {
48
- return this.redirect;
49
- }
53
+ getRedirect(): CommandNode<S> {
54
+ return this.redirect;
55
+ }
50
56
 
51
- getRedirectModifier(): RedirectModifier<S> {
52
- return this.modifier;
53
- }
57
+ getRedirectModifier(): RedirectModifier<S> {
58
+ return this.modifier;
59
+ }
54
60
 
55
- isFork(): boolean {
56
- return this.forks;
57
- }
61
+ isFork(): boolean {
62
+ return this.forks;
63
+ }
58
64
 
59
- canUse(source: S) {
60
- return this.requirement(source);
61
- }
65
+ canUse(source: S) {
66
+ return this.requirement(source);
67
+ }
62
68
 
63
- addChild(node: CommandNode<S>): void {
64
- const child = this.children.get(node.getName());
65
- if (child != null) {
66
- if (node.getCommand() != null) {
67
- child.command = node.getCommand();
68
- }
69
- node.getChildren().forEach((grandChild) => {
70
- child.addChild(grandChild);
71
- });
72
- } else {
73
- this.children.set(node.getName(), node);
74
- if (node instanceof LiteralCommandNode) {
75
- this.literals.set(node.getName(), node);
76
- } else if (node instanceof ArgumentCommandNode) {
77
- this.arguments.set(node.getName(), node);
78
- }
79
- }
80
- }
69
+ addChild(node: CommandNode<S>): void {
70
+ const child = this.children.get(node.getName());
71
+ if (child != null) {
72
+ if (node.getCommand() != null) {
73
+ child.command = node.getCommand();
74
+ }
75
+ node.getChildren().forEach((grandChild) => {
76
+ child.addChild(grandChild);
77
+ });
78
+ } else {
79
+ this.children.set(node.getName(), node);
80
+ if (node instanceof LiteralCommandNode) {
81
+ this.literals.set(node.getName(), node);
82
+ } else if (node instanceof ArgumentCommandNode) {
83
+ this.arguments.set(node.getName(), node);
84
+ }
85
+ }
86
+ }
81
87
 
82
- abstract parse(reader: StringReader, context: CommandContextBuilder<S>): void;
88
+ abstract parse(reader: StringReader, context: CommandContextBuilder<S>): void;
83
89
 
84
- abstract getName(): string;
90
+ abstract getName(): string;
85
91
 
86
- abstract getUsageText(): string;
92
+ abstract getUsageText(): string;
87
93
 
88
- abstract listSuggestions(context: CommandContext<S>, builder: SuggestionsBuilder): Promise<Suggestions>;
94
+ abstract listSuggestions(
95
+ context: CommandContext<S>,
96
+ builder: SuggestionsBuilder,
97
+ ): Promise<Suggestions>;
89
98
 
90
- getRelevantNodes(input: StringReader): CommandNode<S>[] {
91
- if (this.literals.size > 0) {
92
- const cursor = input.getCursor();
93
- while (input.canRead() && input.peek() != " ") {
94
- input.skip();
95
- }
96
- const text = input.getString().substring(cursor, input.getCursor());
97
- input.setCursor(cursor);
98
- const literal = this.literals.get(text);
99
- if (literal != null) {
100
- return [literal];
101
- }
102
- }
103
- return Array.from(this.arguments.values());
104
- }
99
+ getRelevantNodes(input: StringReader): CommandNode<S>[] {
100
+ if (this.literals.size > 0) {
101
+ const cursor = input.getCursor();
102
+ while (input.canRead() && input.peek() !== " ") {
103
+ input.skip();
104
+ }
105
+ const text = input.getString().substring(cursor, input.getCursor());
106
+ input.setCursor(cursor);
107
+ const literal = this.literals.get(text);
108
+ if (literal != null) {
109
+ return [literal];
110
+ }
111
+ }
112
+ return Array.from(this.arguments.values());
113
+ }
105
114
  }
@@ -1,64 +1,85 @@
1
- import {
2
- CommandNode,
3
- StringReader,
4
- Command,
5
- StringRange,
6
- CommandContext,
7
- CommandContextBuilder,
8
- Predicate,
9
- RedirectModifier,
10
- CommandSyntaxError,
11
- Suggestions,
12
- SuggestionsBuilder
13
- } from '..';
1
+ import {
2
+ CommandNode,
3
+ type StringReader,
4
+ type Command,
5
+ StringRange,
6
+ type CommandContext,
7
+ type CommandContextBuilder,
8
+ type Predicate,
9
+ type RedirectModifier,
10
+ CommandSyntaxError,
11
+ Suggestions,
12
+ type SuggestionsBuilder,
13
+ } from "..";
14
14
 
15
15
  export class LiteralCommandNode<S> extends CommandNode<S> {
16
- private literal: string;
17
-
18
- constructor(literal: string, command: Command<S>, requirement: Predicate<S>, redirect: CommandNode<S>, modifier: RedirectModifier<S>, forks: boolean) {
19
- super(command, requirement, redirect, modifier, forks);
20
- this.literal = literal;
21
- }
16
+ private literal: string;
22
17
 
23
- parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {
24
- const start = reader.getCursor();
25
- const end = this.parseInternal(reader);
26
- if (end > -1) {
27
- contextBuilder.withNode(this, new StringRange(start, end));
28
- return;
29
- }
30
- throw CommandSyntaxError.LITERAL_INCORRECT.createWithContext(reader, this.literal);
31
- }
18
+ constructor(
19
+ literal: string,
20
+ command: Command<S>,
21
+ requirement: Predicate<S>,
22
+ redirect: CommandNode<S>,
23
+ modifier: RedirectModifier<S>,
24
+ forks: boolean,
25
+ ) {
26
+ super(command, requirement, redirect, modifier, forks);
27
+ this.literal = literal;
28
+ }
32
29
 
33
- private parseInternal(reader: StringReader): number {
34
- const start = reader.getCursor();
35
- if (reader.canRead(this.literal.length)) {
36
- const end = start + this.literal.length;
37
- if (reader.getString().substr(start, this.literal.length) === this.literal) {
38
- reader.setCursor(end);
39
- if (!reader.canRead() || reader.peek() == " ") {
40
- return end;
41
- } else {
42
- reader.setCursor(start);
43
- }
44
- }
45
- }
46
- return -1;
47
- }
48
-
49
- getName(): string {
50
- return this.literal;
51
- }
30
+ parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {
31
+ const start = reader.getCursor();
32
+ const end = this.parseInternal(reader);
33
+ if (end > -1) {
34
+ contextBuilder.withNode(this, new StringRange(start, end));
35
+ return;
36
+ }
37
+ throw CommandSyntaxError.LITERAL_INCORRECT.createWithContext(
38
+ reader,
39
+ this.literal,
40
+ );
41
+ }
52
42
 
53
- getUsageText(): string {
54
- return this.literal;
55
- }
43
+ private parseInternal(reader: StringReader): number {
44
+ const start = reader.getCursor();
45
+ if (reader.canRead(this.literal.length)) {
46
+ const end = start + this.literal.length;
47
+ if (
48
+ reader.getString().substring(start, this.literal.length) ===
49
+ this.literal
50
+ ) {
51
+ reader.setCursor(end);
52
+ if (!reader.canRead() || reader.peek() === " ") {
53
+ return end;
54
+ } else {
55
+ reader.setCursor(start);
56
+ }
57
+ }
58
+ }
59
+ return -1;
60
+ }
56
61
 
57
- listSuggestions(context: CommandContext<S>, builder: SuggestionsBuilder): Promise<Suggestions> {
58
- if (this.literal.toLowerCase().startsWith(builder.getRemaining().toLowerCase())) {
59
- return builder.suggest(this.literal).buildPromise();
60
- } else {
61
- return Suggestions.empty();
62
- }
63
- }
62
+ getName(): string {
63
+ return this.literal;
64
+ }
65
+
66
+ getUsageText(): string {
67
+ return this.literal;
68
+ }
69
+
70
+ listSuggestions(
71
+ // biome-ignore lint/correctness/noUnusedFunctionParameters: yes
72
+ context: CommandContext<S>,
73
+ builder: SuggestionsBuilder,
74
+ ): Promise<Suggestions> {
75
+ if (
76
+ this.literal
77
+ .toLowerCase()
78
+ .startsWith(builder.getRemaining().toLowerCase())
79
+ ) {
80
+ return builder.suggest(this.literal).buildPromise();
81
+ } else {
82
+ return Suggestions.empty();
83
+ }
84
+ }
64
85
  }
@@ -1,30 +1,40 @@
1
- import {
2
- CommandNode,
3
- StringReader,
4
- CommandContextBuilder,
5
- CommandContext,
6
- Suggestions,
7
- SuggestionsBuilder
8
- } from '..';
1
+ import {
2
+ CommandNode,
3
+ type StringReader,
4
+ type CommandContextBuilder,
5
+ type CommandContext,
6
+ Suggestions,
7
+ type SuggestionsBuilder,
8
+ } from "..";
9
9
 
10
10
  export class RootCommandNode<S> extends CommandNode<S> {
11
+ constructor() {
12
+ super(
13
+ null,
14
+ async (_) => true,
15
+ null,
16
+ (_) => null,
17
+ false,
18
+ );
19
+ }
11
20
 
12
- constructor() {
13
- super(null, async c => true, null, c => null, false);
14
- }
21
+ // biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
22
+ parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {}
15
23
 
16
- parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>): void {
17
- }
24
+ getName(): string {
25
+ return "";
26
+ }
18
27
 
19
- getName(): string {
20
- return "";
21
- }
28
+ getUsageText(): string {
29
+ return "";
30
+ }
22
31
 
23
- getUsageText(): string {
24
- return "";
25
- }
26
-
27
- listSuggestions(context: CommandContext<S>, builder: SuggestionsBuilder): Promise<Suggestions> {
28
- return Suggestions.empty();
29
- }
32
+ listSuggestions(
33
+ // biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
34
+ context: CommandContext<S>,
35
+ // biome-ignore lint/correctness/noUnusedFunctionParameters: no-op
36
+ builder: SuggestionsBuilder,
37
+ ): Promise<Suggestions> {
38
+ return Suggestions.empty();
39
+ }
30
40
  }
@@ -1,36 +1,50 @@
1
- import { argument, CommandDispatcher, FloatArgumentType, IntegerArgumentType, literal, LongArgumentType } from '../src'
1
+ import {
2
+ argument,
3
+ bool,
4
+ CommandDispatcher,
5
+ FloatArgumentType,
6
+ IntegerArgumentType,
7
+ literal,
8
+ LongArgumentType,
9
+ } from "../src";
2
10
 
3
- describe('Arguments', () => {
4
- test('Integer', async () => {
5
- const dispatcher = new CommandDispatcher()
6
- dispatcher.register(literal('foo')
7
- .then(argument('bar', new IntegerArgumentType())
8
- .executes(async ctx => ctx.get('bar') * 2)
9
- )
10
- )
11
- const result = await dispatcher.execute('foo 6', undefined)
12
- expect(result).toEqual(12)
13
- })
11
+ describe("Arguments", () => {
12
+ test("Integer", async () => {
13
+ const dispatcher = new CommandDispatcher();
14
+ dispatcher.register(
15
+ literal("foo").then(
16
+ argument("bar", new IntegerArgumentType()).executes(
17
+ async (ctx) => ctx.get("bar") * 2,
18
+ ),
19
+ ),
20
+ );
21
+ const result = await dispatcher.execute("foo 6", undefined);
22
+ expect(result).toEqual(12);
23
+ });
14
24
 
15
- test('Long', async () => {
16
- const dispatcher = new CommandDispatcher()
17
- dispatcher.register(literal('foo')
18
- .then(argument('bar', new LongArgumentType())
19
- .executes(async ctx => ctx.get('bar').toString().length)
20
- )
21
- )
22
- const result = await dispatcher.execute('foo 123456789012345', undefined)
23
- expect(result).toEqual(15)
24
- })
25
+ test("Long", async () => {
26
+ const dispatcher = new CommandDispatcher();
27
+ dispatcher.register(
28
+ literal("foo").then(
29
+ argument("bar", new LongArgumentType()).executes(
30
+ async (ctx) => ctx.get("bar").toString().length,
31
+ ),
32
+ ),
33
+ );
34
+ const result = await dispatcher.execute("foo 123456789012345", undefined);
35
+ expect(result).toEqual(15);
36
+ });
25
37
 
26
- test('Float', async () => {
27
- const dispatcher = new CommandDispatcher()
28
- dispatcher.register(literal('foo')
29
- .then(argument('bar', new FloatArgumentType())
30
- .executes(async ctx => Math.floor(ctx.get('bar')))
31
- )
32
- )
33
- const result = await dispatcher.execute('foo 6.2', undefined)
34
- expect(result).toEqual(6)
35
- })
36
- })
38
+ test("Float", async () => {
39
+ const dispatcher = new CommandDispatcher();
40
+ dispatcher.register(
41
+ literal("foo").then(
42
+ argument("bar", new FloatArgumentType()).executes(async (ctx) =>
43
+ Math.floor(ctx.get("bar")),
44
+ ),
45
+ ),
46
+ );
47
+ const result = await dispatcher.execute("foo 6.2", undefined);
48
+ expect(result).toEqual(6);
49
+ });
50
+ });
@@ -1,25 +1,21 @@
1
- import { CommandDispatcher, literal } from '../src'
1
+ import { CommandDispatcher, literal } from "../src";
2
2
 
3
- describe('CommandDispatcher', () => {
4
- test('create', () => {
5
- const dispatcher = new CommandDispatcher()
6
- })
3
+ describe("CommandDispatcher", () => {
4
+ test("create", () => {
5
+ new CommandDispatcher();
6
+ });
7
7
 
8
- test('execute', async () => {
9
- const dispatcher = new CommandDispatcher()
10
- dispatcher.register(literal('foo')
11
- .executes(async () => 2)
12
- )
13
- const result = await dispatcher.execute('foo', undefined)
14
- expect(result).toEqual(2)
15
- })
8
+ test("execute", async () => {
9
+ const dispatcher = new CommandDispatcher();
10
+ dispatcher.register(literal("foo").executes(async () => 2));
11
+ const result = await dispatcher.execute("foo", undefined);
12
+ expect(result).toEqual(2);
13
+ });
16
14
 
17
- test('execute (zero result)', async () => {
18
- const dispatcher = new CommandDispatcher()
19
- dispatcher.register(literal('foo')
20
- .executes(async () => 0)
21
- )
22
- const result = await dispatcher.execute('foo', undefined)
23
- expect(result).toEqual(0)
24
- })
25
- })
15
+ test("execute (zero result)", async () => {
16
+ const dispatcher = new CommandDispatcher();
17
+ dispatcher.register(literal("foo").executes(async () => 0));
18
+ const result = await dispatcher.execute("foo", undefined);
19
+ expect(result).toEqual(0);
20
+ });
21
+ });
@@ -1,47 +1,47 @@
1
- import { StringReader } from '../src/StringReader'
2
-
3
- describe('StringReader', () => {
4
- test('readInt', () => {
5
- const reader = new StringReader('5')
6
- const value = reader.readInt()
7
- expect(value).toEqual(5)
8
- })
9
-
10
- test('readInt (trailing)', () => {
11
- const reader = new StringReader('5a')
12
- const value = reader.readInt()
13
- expect(value).toEqual(5)
14
- expect(reader.getCursor()).toEqual(1)
15
- })
16
-
17
- test('readInt (NaN)', () => {
18
- const reader = new StringReader('5-')
19
- expect(() => reader.readInt()).toThrow('Invalid integer')
20
- })
21
-
22
- test('readInt (invalid)', () => {
23
- const reader = new StringReader('a')
24
- expect(() => reader.readInt()).toThrow('Expected integer')
25
- })
26
-
27
- test('readInt (float)', () => {
28
- const reader = new StringReader('1.3')
29
- expect(() => reader.readInt()).toThrow('Invalid integer')
30
- })
31
-
32
- test('readFloat', () => {
33
- const reader = new StringReader('1.3')
34
- const value = reader.readFloat()
35
- expect(value).toEqual(1.3)
36
- })
37
-
38
- test('readFloat (NaN)', () => {
39
- const reader = new StringReader('1.3-')
40
- expect(() => reader.readFloat()).toThrow('Invalid float')
41
- })
42
-
43
- test('readFloat (invalid)', () => {
44
- const reader = new StringReader('sw')
45
- expect(() => reader.readFloat()).toThrow('Expected float')
46
- })
47
- })
1
+ import { StringReader } from "../src/StringReader";
2
+
3
+ describe("StringReader", () => {
4
+ test("readInt", () => {
5
+ const reader = new StringReader("5");
6
+ const value = reader.readInt();
7
+ expect(value).toEqual(5);
8
+ });
9
+
10
+ test("readInt (trailing)", () => {
11
+ const reader = new StringReader("5a");
12
+ const value = reader.readInt();
13
+ expect(value).toEqual(5);
14
+ expect(reader.getCursor()).toEqual(1);
15
+ });
16
+
17
+ test("readInt (NaN)", () => {
18
+ const reader = new StringReader("5-");
19
+ expect(() => reader.readInt()).toThrow("Invalid integer");
20
+ });
21
+
22
+ test("readInt (invalid)", () => {
23
+ const reader = new StringReader("a");
24
+ expect(() => reader.readInt()).toThrow("Expected integer");
25
+ });
26
+
27
+ test("readInt (float)", () => {
28
+ const reader = new StringReader("1.3");
29
+ expect(() => reader.readInt()).toThrow("Invalid integer");
30
+ });
31
+
32
+ test("readFloat", () => {
33
+ const reader = new StringReader("1.3");
34
+ const value = reader.readFloat();
35
+ expect(value).toEqual(1.3);
36
+ });
37
+
38
+ test("readFloat (NaN)", () => {
39
+ const reader = new StringReader("1.3-");
40
+ expect(() => reader.readFloat()).toThrow("Invalid float");
41
+ });
42
+
43
+ test("readFloat (invalid)", () => {
44
+ const reader = new StringReader("sw");
45
+ expect(() => reader.readFloat()).toThrow("Expected float");
46
+ });
47
+ });
package/tsconfig.json CHANGED
@@ -1,16 +1,11 @@
1
1
  {
2
- "compilerOptions": {
3
- "target": "es5",
4
- "module": "commonjs",
5
- "lib": [ "es2015", "dom" ],
6
- "declaration": true,
7
- "outDir": "dist"
8
- },
9
- "include": [
10
- "src"
11
- ],
12
- "exclude": [
13
- "node_modules",
14
- "dist"
15
- ]
2
+ "compilerOptions": {
3
+ "target": "es2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020", "dom"],
6
+ "declaration": true,
7
+ "outDir": "dist"
8
+ },
9
+ "include": ["src"],
10
+ "exclude": ["node_modules", "dist"]
16
11
  }