InputSpec.scala 54.1 KB
Newer Older
1 2
package zio.redis

梦境迷离's avatar
梦境迷离 已提交
3
import zio._
4
import zio.redis.Input._
5 6
import zio.redis.internal.RespCommand
import zio.redis.internal.RespCommandArgument._
7 8 9
import zio.test.Assertion._
import zio.test._

D
Dejan Mijić 已提交
10 11 12
import java.net.InetAddress
import java.time.Instant

13
object InputSpec extends BaseSpec {
D
Dejan Mijić 已提交
14 15 16 17 18
  import BitFieldCommand._
  import BitFieldType._
  import BitOperation._
  import Order._
  import RadiusUnit._
梦境迷离's avatar
梦境迷离 已提交
19
  import StrAlgoLcsQueryType._
20

D
Dejan Mijić 已提交
21
  def spec: Spec[Any, Throwable] =
22 23
    suite("Input encoders")(
      suite("AbsTtl")(
梦境迷离's avatar
梦境迷离 已提交
24
        test("valid value") {
25
          for {
梦境迷离's avatar
梦境迷离 已提交
26
            result <- ZIO.attempt(AbsTtlInput.encode(AbsTtl))
27
          } yield assert(result)(equalTo(RespCommand(Literal("ABSTTL"))))
28 29
        }
      ),
30
      suite("Address")(
梦境迷离's avatar
梦境迷离 已提交
31
        test("valid value") {
32
          for {
梦境迷离's avatar
梦境迷离 已提交
33 34 35
            ip     <- ZIO.succeed(InetAddress.getByName("127.0.0.1"))
            port   <- ZIO.succeed(42)
            result <- ZIO.attempt(AddressInput.encode(Address(ip, port)))
36
          } yield assert(result)(equalTo(RespCommand(Unknown("127.0.0.1:42"))))
37 38
        }
      ),
39
      suite("Aggregate")(
梦境迷离's avatar
梦境迷离 已提交
40
        test("max") {
41
          for {
梦境迷离's avatar
梦境迷离 已提交
42
            result <- ZIO.attempt(AggregateInput.encode(Aggregate.Max))
43
          } yield assert(result)(equalTo(RespCommand(Literal("AGGREGATE"), Literal("MAX"))))
44
        },
梦境迷离's avatar
梦境迷离 已提交
45
        test("min") {
46
          for {
梦境迷离's avatar
梦境迷离 已提交
47
            result <- ZIO.attempt(AggregateInput.encode(Aggregate.Min))
48
          } yield assert(result)(equalTo(RespCommand(Literal("AGGREGATE"), Literal("MIN"))))
49
        },
梦境迷离's avatar
梦境迷离 已提交
50
        test("sum") {
51
          for {
梦境迷离's avatar
梦境迷离 已提交
52
            result <- ZIO.attempt(AggregateInput.encode(Aggregate.Sum))
53
          } yield assert(result)(equalTo(RespCommand(Literal("AGGREGATE"), Literal("SUM"))))
54 55
        }
      ),
56
      suite("Alpha")(
梦境迷离's avatar
梦境迷离 已提交
57
        test("alpha") {
58
          for {
梦境迷离's avatar
梦境迷离 已提交
59
            result <- ZIO.attempt(AlphaInput.encode(Alpha))
60
          } yield assert(result)(equalTo(RespCommand(Literal("ALPHA"))))
61 62
        }
      ),
63
      suite("Auth")(
梦境迷离's avatar
梦境迷离 已提交
64
        test("with empty password") {
65
          for {
66 67
            result <- ZIO.attempt(AuthInput.encode(Auth(None, "")))
          } yield assert(result)(equalTo(RespCommand(Value(""))))
68
        },
梦境迷离's avatar
梦境迷离 已提交
69
        test("with non-empty password") {
70
          for {
71 72 73 74 75 76 77
            result <- ZIO.attempt(AuthInput.encode(Auth(None, "pass")))
          } yield assert(result)(equalTo(RespCommand(Value("pass"))))
        },
        test("with both username and password") {
          for {
            result <- ZIO.attempt(AuthInput.encode(Auth(Some("user"), "pass")))
          } yield assert(result)(equalTo(RespCommand(Value("user"), Value("pass"))))
78 79 80
        }
      ),
      suite("Bool")(
梦境迷离's avatar
梦境迷离 已提交
81
        test("true") {
82
          for {
梦境迷离's avatar
梦境迷离 已提交
83
            result <- ZIO.attempt(BoolInput.encode(true))
84
          } yield assert(result)(equalTo(RespCommand(Literal("1"))))
85
        },
梦境迷离's avatar
梦境迷离 已提交
86
        test("false") {
87
          for {
梦境迷离's avatar
梦境迷离 已提交
88
            result <- ZIO.attempt(BoolInput.encode(false))
89
          } yield assert(result)(equalTo(RespCommand(Literal("0"))))
90 91
        }
      ),
B
barthorre 已提交
92 93 94
      suite("Stralgocommand")(
        test("length option") {
          assert(StralgoLcsQueryTypeInput.encode(StrAlgoLcsQueryType.Len))(
95
            equalTo(RespCommand(Literal("LEN")))
B
barthorre 已提交
96 97 98 99
          )
        },
        test("idx option default") {
          assert(StralgoLcsQueryTypeInput.encode(Idx()))(
100
            equalTo(RespCommand(Literal("IDX")))
B
barthorre 已提交
101 102 103 104
          )
        },
        test("idx option with minmatchlength") {
          assert(StralgoLcsQueryTypeInput.encode(Idx(minMatchLength = 2)))(
105
            equalTo(RespCommand(Literal("IDX"), Literal("MINMATCHLEN"), Unknown("2")))
B
barthorre 已提交
106 107 108 109
          )
        },
        test("idx option with withmatchlength") {
          assert(StralgoLcsQueryTypeInput.encode(Idx(withMatchLength = true)))(
110
            equalTo(RespCommand(Literal("IDX"), Literal("WITHMATCHLEN")))
B
barthorre 已提交
111 112 113 114
          )
        },
        test("idx option with minmatchlength and withmatchlength") {
          assert(StralgoLcsQueryTypeInput.encode(Idx(minMatchLength = 2, withMatchLength = true)))(
115
            equalTo(RespCommand(Literal("IDX"), Literal("MINMATCHLEN"), Unknown("2"), Literal("WITHMATCHLEN")))
B
barthorre 已提交
116 117 118
          )
        }
      ),
119
      suite("BitFieldCommand")(
梦境迷离's avatar
梦境迷离 已提交
120
        test("get with unsigned type and positive offset") {
121
          for {
梦境迷离's avatar
梦境迷离 已提交
122
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldGet(UnsignedInt(3), 2)))
123
          } yield assert(result)(equalTo(RespCommand(Literal("GET"), Unknown("u3"), Unknown("2"))))
124
        },
梦境迷离's avatar
梦境迷离 已提交
125
        test("get with signed type and negative offset") {
126
          for {
梦境迷离's avatar
梦境迷离 已提交
127
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldGet(SignedInt(3), -2)))
128
          } yield assert(result)(equalTo(RespCommand(Literal("GET"), Unknown("i3"), Unknown("-2"))))
129
        },
梦境迷离's avatar
梦境迷离 已提交
130
        test("get with unsigned type and zero offset") {
131
          for {
梦境迷离's avatar
梦境迷离 已提交
132
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldGet(UnsignedInt(3), 0)))
133
          } yield assert(result)(equalTo(RespCommand(Literal("GET"), Unknown("u3"), Unknown("0"))))
134
        },
梦境迷离's avatar
梦境迷离 已提交
135
        test("set with unsigned type, positive offset and positive value") {
136
          for {
梦境迷离's avatar
梦境迷离 已提交
137
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldSet(UnsignedInt(3), 2, 100L)))
138
          } yield assert(result)(equalTo(RespCommand(Literal("SET"), Unknown("u3"), Unknown("2"), Unknown("100"))))
139
        },
梦境迷离's avatar
梦境迷离 已提交
140
        test("set with signed type, negative offset and negative value") {
141
          for {
梦境迷离's avatar
梦境迷离 已提交
142
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldSet(SignedInt(3), -2, -100L)))
143
          } yield assert(result)(equalTo(RespCommand(Literal("SET"), Unknown("i3"), Unknown("-2"), Unknown("-100"))))
144
        },
梦境迷离's avatar
梦境迷离 已提交
145
        test("set with unsigned type, zero offset and zero value") {
146
          for {
梦境迷离's avatar
梦境迷离 已提交
147
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldSet(UnsignedInt(3), 0, 0L)))
148
          } yield assert(result)(equalTo(RespCommand(Literal("SET"), Unknown("u3"), Unknown("0"), Unknown("0"))))
149
        },
梦境迷离's avatar
梦境迷离 已提交
150
        test("incr with unsigned type, positive offset and positive value") {
151
          for {
梦境迷离's avatar
梦境迷离 已提交
152
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldIncr(UnsignedInt(3), 2, 100L)))
153
          } yield assert(result)(equalTo(RespCommand(Literal("INCRBY"), Unknown("u3"), Unknown("2"), Unknown("100"))))
154
        },
梦境迷离's avatar
梦境迷离 已提交
155
        test("incr with signed type, negative offset and negative value") {
156
          for {
梦境迷离's avatar
梦境迷离 已提交
157
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldIncr(SignedInt(3), -2, -100L)))
158
          } yield assert(result)(equalTo(RespCommand(Literal("INCRBY"), Unknown("i3"), Unknown("-2"), Unknown("-100"))))
159
        },
梦境迷离's avatar
梦境迷离 已提交
160
        test("incr with unsigned type, zero offset and zero value") {
161
          for {
梦境迷离's avatar
梦境迷离 已提交
162
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldIncr(UnsignedInt(3), 0, 0L)))
163
          } yield assert(result)(equalTo(RespCommand(Literal("INCRBY"), Unknown("u3"), Unknown("0"), Unknown("0"))))
164
        },
梦境迷离's avatar
梦境迷离 已提交
165
        test("overflow sat") {
166
          for {
梦境迷离's avatar
梦境迷离 已提交
167
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldOverflow.Sat))
168
          } yield assert(result)(equalTo(RespCommand(Literal("OVERFLOW"), Literal("SAT"))))
169
        },
梦境迷离's avatar
梦境迷离 已提交
170
        test("overflow fail") {
171
          for {
梦境迷离's avatar
梦境迷离 已提交
172
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldOverflow.Fail))
173
          } yield assert(result)(equalTo(RespCommand(Literal("OVERFLOW"), Literal("FAIL"))))
174
        },
梦境迷离's avatar
梦境迷离 已提交
175
        test("overflow warp") {
176
          for {
梦境迷离's avatar
梦境迷离 已提交
177
            result <- ZIO.attempt(BitFieldCommandInput.encode(BitFieldOverflow.Wrap))
178
          } yield assert(result)(equalTo(RespCommand(Literal("OVERFLOW"), Literal("WRAP"))))
179 180 181
        }
      ),
      suite("BitOperation")(
梦境迷离's avatar
梦境迷离 已提交
182
        test("and") {
183
          for {
梦境迷离's avatar
梦境迷离 已提交
184
            result <- ZIO.attempt(BitOperationInput.encode(AND))
185
          } yield assert(result)(equalTo(RespCommand(Literal("AND"))))
186
        },
梦境迷离's avatar
梦境迷离 已提交
187
        test("or") {
188
          for {
梦境迷离's avatar
梦境迷离 已提交
189
            result <- ZIO.attempt(BitOperationInput.encode(OR))
190
          } yield assert(result)(equalTo(RespCommand(Literal("OR"))))
191
        },
梦境迷离's avatar
梦境迷离 已提交
192
        test("xor") {
193
          for {
梦境迷离's avatar
梦境迷离 已提交
194
            result <- ZIO.attempt(BitOperationInput.encode(XOR))
195
          } yield assert(result)(equalTo(RespCommand(Literal("XOR"))))
196
        },
梦境迷离's avatar
梦境迷离 已提交
197
        test("not") {
198
          for {
梦境迷离's avatar
梦境迷离 已提交
199
            result <- ZIO.attempt(BitOperationInput.encode(NOT))
200
          } yield assert(result)(equalTo(RespCommand(Literal("NOT"))))
201 202 203
        }
      ),
      suite("BitPosRange")(
梦境迷离's avatar
梦境迷离 已提交
204
        test("with only start") {
205
          for {
梦境迷离's avatar
梦境迷离 已提交
206
            result <- ZIO.attempt(BitPosRangeInput.encode(BitPosRange(1.second.toMillis, None)))
207
          } yield assert(result)(equalTo(RespCommand(Unknown("1000"))))
208
        },
梦境迷离's avatar
梦境迷离 已提交
209
        test("with start and the end") {
210
          for {
梦境迷离's avatar
梦境迷离 已提交
211
            result <- ZIO.attempt(BitPosRangeInput.encode(BitPosRange(0.second.toMillis, Some(1.second.toMillis))))
212
          } yield assert(result)(equalTo(RespCommand(Unknown("0"), Unknown("1000"))))
213 214
        }
      ),
215
      suite("By")(
梦境迷离's avatar
梦境迷离 已提交
216
        test("with a pattern") {
217
          for {
梦境迷离's avatar
梦境迷离 已提交
218
            result <- ZIO.attempt(ByInput.encode("mykey_*"))
219
          } yield assert(result)(equalTo(RespCommand(Literal("BY"), Unknown("mykey_*"))))
220 221
        }
      ),
222
      suite("Changed")(
梦境迷离's avatar
梦境迷离 已提交
223
        test("valid value") {
224
          for {
梦境迷离's avatar
梦境迷离 已提交
225
            result <- ZIO.attempt(ChangedInput.encode(Changed))
226
          } yield assert(result)(equalTo(RespCommand(Literal("CH"))))
227 228
        }
      ),
229
      suite("ClientKill")(
梦境迷离's avatar
梦境迷离 已提交
230
        test("address") {
231
          for {
梦境迷离's avatar
梦境迷离 已提交
232 233 234
            address <- ZIO.succeed(InetAddress.getByName("127.0.0.1"))
            port    <- ZIO.succeed(42)
            result  <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.Address(address, port)))
235
          } yield assert(result)(equalTo(RespCommand(Literal("ADDR"), Unknown("127.0.0.1:42"))))
236
        },
梦境迷离's avatar
梦境迷离 已提交
237
        test("local address") {
238
          for {
梦境迷离's avatar
梦境迷离 已提交
239 240 241
            address <- ZIO.succeed(InetAddress.getByName("127.0.0.1"))
            port    <- ZIO.succeed(42)
            result  <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.LocalAddress(address, port)))
242
          } yield assert(result)(equalTo(RespCommand(Literal("LADDR"), Unknown(s"127.0.0.1:42"))))
243
        },
梦境迷离's avatar
梦境迷离 已提交
244
        test("client id") {
245
          for {
梦境迷离's avatar
梦境迷离 已提交
246 247
            id     <- ZIO.succeed(42L)
            result <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.Id(id)))
248
          } yield assert(result)(equalTo(RespCommand(Literal("ID"), Unknown("42"))))
249
        },
梦境迷离's avatar
梦境迷离 已提交
250
        test("type") {
251
          for {
梦境迷离's avatar
梦境迷离 已提交
252 253
            clientType <- ZIO.succeed(ClientType.PubSub)
            result     <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.Type(clientType)))
254
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("PUBSUB"))))
255
        },
梦境迷离's avatar
梦境迷离 已提交
256
        test("user") {
257
          for {
梦境迷离's avatar
梦境迷离 已提交
258 259
            user   <- ZIO.succeed("Foo Bar")
            result <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.User(user)))
260
          } yield assert(result)(equalTo(RespCommand(Literal("USER"), Unknown("Foo Bar"))))
261
        },
梦境迷离's avatar
梦境迷离 已提交
262
        test("skip me") {
263
          for {
梦境迷离's avatar
梦境迷离 已提交
264
            result <- ZIO.attempt(ClientKillInput.encode(ClientKillFilter.SkipMe(true)))
265
          } yield assert(result)(equalTo(RespCommand(Literal("SKIPME"), Literal("YES"))))
266 267 268
        }
      ),
      suite("ClientPauseMode")(
梦境迷离's avatar
梦境迷离 已提交
269
        test("all") {
270
          for {
梦境迷离's avatar
梦境迷离 已提交
271
            result <- ZIO.attempt(ClientPauseModeInput.encode(ClientPauseMode.All))
272
          } yield assert(result)(equalTo(RespCommand(Literal("ALL"))))
273
        },
梦境迷离's avatar
梦境迷离 已提交
274
        test("write") {
275
          for {
梦境迷离's avatar
梦境迷离 已提交
276
            result <- ZIO.attempt(ClientPauseModeInput.encode(ClientPauseMode.Write))
277
          } yield assert(result)(equalTo(RespCommand(Literal("WRITE"))))
278 279 280
        }
      ),
      suite("ClientTracking")(
梦境迷离's avatar
梦境迷离 已提交
281
        test("off") {
282
          for {
梦境迷离's avatar
梦境迷离 已提交
283
            result <- ZIO.attempt(ClientTrackingInput.encode(None))
284
          } yield assert(result)(equalTo(RespCommand(Literal("OFF"))))
285
        },
梦境迷离's avatar
梦境迷离 已提交
286
        test("client redirect with noloop and prefixes") {
287
          for {
梦境迷离's avatar
梦境迷离 已提交
288 289 290
            clientId <- ZIO.succeed(42L)
            prefixes <- ZIO.succeed(Chunk("prefix1", "prefix2", "prefix3"))
            result   <- ZIO.attempt(ClientTrackingInput.encode(Some((Some(clientId), None, true, prefixes))))
291 292
          } yield assert(result)(
            equalTo(
293 294 295
              RespCommand(Literal("ON"), Literal("REDIRECT"), Unknown(clientId.toString)) ++ prefixes
                .map(p => RespCommand(Literal("PREFIX"), Unknown(p)))
                .fold(RespCommand.empty)(_ ++ _) ++ RespCommand(Literal("NOLOOP"))
296 297 298
            )
          )
        },
梦境迷离's avatar
梦境迷离 已提交
299
        test("broadcast mode") {
300 301
          for {
            result <-
梦境迷离's avatar
梦境迷离 已提交
302 303 304
              ZIO.attempt(
                ClientTrackingInput.encode(Some((None, Some(ClientTrackingMode.Broadcast), false, Chunk.empty)))
              )
305
          } yield assert(result)(equalTo(RespCommand(Literal("ON"), Literal("BCAST"))))
306 307
        }
      ),
308
      suite("Copy")(
梦境迷离's avatar
梦境迷离 已提交
309
        test("valid value") {
310
          for {
梦境迷离's avatar
梦境迷离 已提交
311
            result <- ZIO.attempt(CopyInput.encode(Copy))
312
          } yield assert(result)(equalTo(RespCommand(Literal("COPY"))))
313 314 315
        }
      ),
      suite("Count")(
梦境迷离's avatar
梦境迷离 已提交
316
        test("positive value") {
317
          for {
梦境迷离's avatar
梦境迷离 已提交
318
            result <- ZIO.attempt(CountInput.encode(Count(3L)))
319
          } yield assert(result)(equalTo(RespCommand(Literal("COUNT"), Unknown("3"))))
320
        },
梦境迷离's avatar
梦境迷离 已提交
321
        test("negative value") {
322
          for {
梦境迷离's avatar
梦境迷离 已提交
323
            result <- ZIO.attempt(CountInput.encode(Count(-3L)))
324
          } yield assert(result)(equalTo(RespCommand(Literal("COUNT"), Unknown("-3"))))
325
        },
梦境迷离's avatar
梦境迷离 已提交
326
        test("zero value") {
327
          for {
梦境迷离's avatar
梦境迷离 已提交
328
            result <- ZIO.attempt(CountInput.encode(Count(0L)))
329
          } yield assert(result)(equalTo(RespCommand(Literal("COUNT"), Unknown("0"))))
330 331 332
        }
      ),
      suite("Position")(
梦境迷离's avatar
梦境迷离 已提交
333
        test("before") {
334
          for {
梦境迷离's avatar
梦境迷离 已提交
335
            result <- ZIO.attempt(PositionInput.encode(Position.Before))
336
          } yield assert(result)(equalTo(RespCommand(Literal("BEFORE"))))
337
        },
梦境迷离's avatar
梦境迷离 已提交
338
        test("after") {
339
          for {
梦境迷离's avatar
梦境迷离 已提交
340
            result <- ZIO.attempt(PositionInput.encode(Position.After))
341
          } yield assert(result)(equalTo(RespCommand(Literal("AFTER"))))
342 343
        }
      ),
344
      suite("RedisType")(
梦境迷离's avatar
梦境迷离 已提交
345
        test("string type") {
346
          for {
梦境迷离's avatar
梦境迷离 已提交
347
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.String))
348
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("string"))))
349
        },
梦境迷离's avatar
梦境迷离 已提交
350
        test("list type") {
351
          for {
梦境迷离's avatar
梦境迷离 已提交
352
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.List))
353
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("list"))))
354
        },
梦境迷离's avatar
梦境迷离 已提交
355
        test("set type") {
356
          for {
梦境迷离's avatar
梦境迷离 已提交
357
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.Set))
358
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("set"))))
359
        },
梦境迷离's avatar
梦境迷离 已提交
360
        test("sorted set type") {
361
          for {
梦境迷离's avatar
梦境迷离 已提交
362
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.SortedSet))
363
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("zset"))))
364
        },
梦境迷离's avatar
梦境迷离 已提交
365
        test("hash type") {
366
          for {
梦境迷离's avatar
梦境迷离 已提交
367
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.Hash))
368
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("hash"))))
369
        },
梦境迷离's avatar
梦境迷离 已提交
370
        test("stream type") {
371
          for {
梦境迷离's avatar
梦境迷离 已提交
372
            result <- ZIO.attempt(RedisTypeInput.encode(RedisType.Stream))
373
          } yield assert(result)(equalTo(RespCommand(Literal("TYPE"), Literal("stream"))))
374 375
        }
      ),
376
      suite("Double")(
梦境迷离's avatar
梦境迷离 已提交
377
        test("positive value") {
378
          for {
梦境迷离's avatar
梦境迷离 已提交
379
            result <- ZIO.attempt(DoubleInput.encode(4.2d))
380
          } yield assert(result)(equalTo(RespCommand(Unknown("4.2"))))
381
        },
梦境迷离's avatar
梦境迷离 已提交
382
        test("negative value") {
383
          for {
梦境迷离's avatar
梦境迷离 已提交
384
            result <- ZIO.attempt(DoubleInput.encode(-4.2d))
385
          } yield assert(result)(equalTo(RespCommand(Unknown("-4.2"))))
386
        },
梦境迷离's avatar
梦境迷离 已提交
387
        test("zero value") {
388
          for {
梦境迷离's avatar
梦境迷离 已提交
389
            result <- ZIO.attempt(DoubleInput.encode(0d))
390
          } yield assert(result)(equalTo(RespCommand(Unknown("0.0"))))
391 392 393
        }
      ),
      suite("DurationMilliseconds")(
梦境迷离's avatar
梦境迷离 已提交
394
        test("1 second") {
395
          for {
梦境迷离's avatar
梦境迷离 已提交
396
            result <- ZIO.attempt(DurationMillisecondsInput.encode(1.second))
397
          } yield assert(result)(equalTo(RespCommand(Unknown("1000"))))
398
        },
梦境迷离's avatar
梦境迷离 已提交
399
        test("100 milliseconds") {
400
          for {
梦境迷离's avatar
梦境迷离 已提交
401
            result <- ZIO.attempt(DurationMillisecondsInput.encode(100.millis))
402
          } yield assert(result)(equalTo(RespCommand(Unknown("100"))))
403 404 405
        }
      ),
      suite("DurationSeconds")(
梦境迷离's avatar
梦境迷离 已提交
406
        test("1 minute") {
407
          for {
梦境迷离's avatar
梦境迷离 已提交
408
            result <- ZIO.attempt(DurationSecondsInput.encode(1.minute))
409
          } yield assert(result)(equalTo(RespCommand(Unknown("60"))))
410
        },
梦境迷离's avatar
梦境迷离 已提交
411
        test("1 second") {
412
          for {
梦境迷离's avatar
梦境迷离 已提交
413
            result <- ZIO.attempt(DurationSecondsInput.encode(1.second))
414
          } yield assert(result)(equalTo(RespCommand(Unknown("1"))))
415
        },
梦境迷离's avatar
梦境迷离 已提交
416
        test("100 milliseconds") {
417
          for {
梦境迷离's avatar
梦境迷离 已提交
418
            result <- ZIO.attempt(DurationSecondsInput.encode(100.millis))
419
          } yield assert(result)(equalTo(RespCommand(Unknown("0"))))
420 421 422
        }
      ),
      suite("DurationTtl")(
梦境迷离's avatar
梦境迷离 已提交
423
        test("1 second") {
424
          for {
梦境迷离's avatar
梦境迷离 已提交
425
            result <- ZIO.attempt(DurationTtlInput.encode(1.second))
426
          } yield assert(result)(equalTo(RespCommand(Literal("PX"), Unknown("1000"))))
427
        },
梦境迷离's avatar
梦境迷离 已提交
428
        test("100 milliseconds") {
429
          for {
梦境迷离's avatar
梦境迷离 已提交
430
            result <- ZIO.attempt(DurationTtlInput.encode(100.millis))
431
          } yield assert(result)(equalTo(RespCommand(Literal("PX"), Unknown("100"))))
432 433 434
        }
      ),
      suite("Freq")(
梦境迷离's avatar
梦境迷离 已提交
435
        test("empty string") {
436
          for {
梦境迷离's avatar
梦境迷离 已提交
437
            result <- ZIO.attempt(FreqInput.encode(Freq("")))
438
          } yield assert(result)(equalTo(RespCommand(Literal("FREQ"), Unknown(""))))
439
        },
梦境迷离's avatar
梦境迷离 已提交
440
        test("non-empty string") {
441
          for {
梦境迷离's avatar
梦境迷离 已提交
442
            result <- ZIO.attempt(FreqInput.encode(Freq("frequency")))
443
          } yield assert(result)(equalTo(RespCommand(Literal("FREQ"), Unknown("frequency"))))
444 445
        }
      ),
446
      suite("Get")(
梦境迷离's avatar
梦境迷离 已提交
447
        test("with a pattern") {
448
          for {
梦境迷离's avatar
梦境迷离 已提交
449
            result <- ZIO.attempt(GetInput.encode("mypattern_*"))
450
          } yield assert(result)(equalTo(RespCommand(Literal("GET"), Unknown("mypattern_*"))))
451 452
        }
      ),
453 454 455 456 457 458 459
      suite("GetKeyword")(
        test("valid value") {
          for {
            result <- ZIO.attempt(GetKeywordInput.encode(GetKeyword))
          } yield assert(result)(equalTo(RespCommand(Literal("GET"))))
        }
      ),
460
      suite("IdleTime")(
梦境迷离's avatar
梦境迷离 已提交
461
        test("0 seconds") {
462
          for {
梦境迷离's avatar
梦境迷离 已提交
463
            result <- ZIO.attempt(IdleTimeInput.encode(IdleTime(0)))
464
          } yield assert(result)(equalTo(RespCommand(Literal("IDLETIME"), Unknown("0"))))
465
        },
梦境迷离's avatar
梦境迷离 已提交
466
        test("5 seconds") {
467
          for {
梦境迷离's avatar
梦境迷离 已提交
468
            result <- ZIO.attempt(IdleTimeInput.encode(IdleTime(5)))
469
          } yield assert(result)(equalTo(RespCommand(Literal("IDLETIME"), Unknown("5"))))
470 471 472
        }
      ),
      suite("Increment")(
梦境迷离's avatar
梦境迷离 已提交
473
        test("valid value") {
474
          for {
梦境迷离's avatar
梦境迷离 已提交
475
            result <- ZIO.attempt(IncrementInput.encode(Increment))
476
          } yield assert(result)(equalTo(RespCommand(Literal("INCR"))))
477 478 479
        }
      ),
      suite("KeepTtl")(
梦境迷离's avatar
梦境迷离 已提交
480
        test("valid value") {
481
          for {
梦境迷离's avatar
梦境迷离 已提交
482
            result <- ZIO.attempt(KeepTtlInput.encode(KeepTtl))
483
          } yield assert(result)(equalTo(RespCommand(Literal("KEEPTTL"))))
484 485 486
        }
      ),
      suite("LexRange")(
梦境迷离's avatar
梦境迷离 已提交
487
        test("with unbound min and unbound max") {
488
          for {
梦境迷离's avatar
梦境迷离 已提交
489
            result <- ZIO.attempt(
490
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
491
                          .encode((LexMinimum.Unbounded.asString, LexMaximum.Unbounded.asString))
A
Anatoly Sergeev 已提交
492
                      )
493
          } yield assert(result)(equalTo(RespCommand(Value("-"), Value("+"))))
494
        },
梦境迷离's avatar
梦境迷离 已提交
495
        test("with open min and unbound max") {
496
          for {
梦境迷离's avatar
梦境迷离 已提交
497
            result <- ZIO.attempt(
498
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
499
                          .encode((LexMinimum.Open("a").asString, LexMaximum.Unbounded.asString))
A
Anatoly Sergeev 已提交
500
                      )
501
          } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("+"))))
502
        },
梦境迷离's avatar
梦境迷离 已提交
503
        test("with closed min and unbound max") {
504
          for {
梦境迷离's avatar
梦境迷离 已提交
505
            result <- ZIO.attempt(
506
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
507
                          .encode((LexMinimum.Closed("a").asString, LexMaximum.Unbounded.asString))
A
Anatoly Sergeev 已提交
508
                      )
509
          } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("+"))))
510
        },
梦境迷离's avatar
梦境迷离 已提交
511
        test("with unbound min and open max") {
512
          for {
梦境迷离's avatar
梦境迷离 已提交
513
            result <- ZIO.attempt(
514
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
515
                          .encode((LexMinimum.Unbounded.asString, LexMaximum.Open("z").asString))
A
Anatoly Sergeev 已提交
516
                      )
517
          } yield assert(result)(equalTo(RespCommand(Value("-"), Value("(z"))))
518
        },
梦境迷离's avatar
梦境迷离 已提交
519
        test("with open min and open max") {
520
          for {
梦境迷离's avatar
梦境迷离 已提交
521
            result <- ZIO.attempt(
522
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
523
                          .encode((LexMinimum.Open("a").asString, LexMaximum.Open("z").asString))
A
Anatoly Sergeev 已提交
524
                      )
525
          } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("(z"))))
526
        },
梦境迷离's avatar
梦境迷离 已提交
527
        test("with closed min and open max") {
528
          for {
梦境迷离's avatar
梦境迷离 已提交
529
            result <- ZIO.attempt(
530
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
531
                          .encode((LexMinimum.Closed("a").asString, LexMaximum.Open("z").asString))
A
Anatoly Sergeev 已提交
532
                      )
533
          } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("(z"))))
534
        },
梦境迷离's avatar
梦境迷离 已提交
535
        test("with unbound min and closed max") {
536
          for {
梦境迷离's avatar
梦境迷离 已提交
537
            result <- ZIO.attempt(
538
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
539
                          .encode((LexMinimum.Unbounded.asString, LexMaximum.Closed("z").asString))
A
Anatoly Sergeev 已提交
540
                      )
541
          } yield assert(result)(equalTo(RespCommand(Value("-"), Value("[z"))))
542
        },
梦境迷离's avatar
梦境迷离 已提交
543
        test("with open min and closed max") {
544
          for {
梦境迷离's avatar
梦境迷离 已提交
545
            result <- ZIO.attempt(
546
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
547
                          .encode((LexMinimum.Open("a").asString, LexMaximum.Closed("z").asString))
A
Anatoly Sergeev 已提交
548
                      )
549
          } yield assert(result)(equalTo(RespCommand(Value("(a"), Value("[z"))))
550
        },
梦境迷离's avatar
梦境迷离 已提交
551
        test("with closed min and closed max") {
552
          for {
梦境迷离's avatar
梦境迷离 已提交
553
            result <- ZIO.attempt(
554
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
555
                          .encode((LexMinimum.Closed("a").asString, LexMaximum.Closed("z").asString))
A
Anatoly Sergeev 已提交
556
                      )
557
          } yield assert(result)(equalTo(RespCommand(Value("[a"), Value("[z"))))
558 559 560
        }
      ),
      suite("Limit")(
梦境迷离's avatar
梦境迷离 已提交
561
        test("with positive offset and positive count") {
562
          for {
梦境迷离's avatar
梦境迷离 已提交
563
            result <- ZIO.attempt(LimitInput.encode(Limit(4L, 5L)))
564
          } yield assert(result)(equalTo(RespCommand(Literal("LIMIT"), Unknown("4"), Unknown("5"))))
565
        },
梦境迷离's avatar
梦境迷离 已提交
566
        test("with negative offset and negative count") {
567
          for {
梦境迷离's avatar
梦境迷离 已提交
568
            result <- ZIO.attempt(LimitInput.encode(Limit(-4L, -5L)))
569
          } yield assert(result)(equalTo(RespCommand(Literal("LIMIT"), Unknown("-4"), Unknown("-5"))))
570
        },
梦境迷离's avatar
梦境迷离 已提交
571
        test("with zero offset and zero count") {
572
          for {
梦境迷离's avatar
梦境迷离 已提交
573
            result <- ZIO.attempt(LimitInput.encode(Limit(0L, 0L)))
574
          } yield assert(result)(equalTo(RespCommand(Literal("LIMIT"), Unknown("0"), Unknown("0"))))
575 576 577
        }
      ),
      suite("Long")(
梦境迷离's avatar
梦境迷离 已提交
578
        test("positive value") {
579
          for {
梦境迷离's avatar
梦境迷离 已提交
580
            result <- ZIO.attempt(LongInput.encode(4L))
581
          } yield assert(result)(equalTo(RespCommand(Unknown("4"))))
582
        },
梦境迷离's avatar
梦境迷离 已提交
583
        test("negative value") {
584
          for {
梦境迷离's avatar
梦境迷离 已提交
585
            result <- ZIO.attempt(LongInput.encode(-4L))
586
          } yield assert(result)(equalTo(RespCommand(Unknown("-4"))))
587
        },
梦境迷离's avatar
梦境迷离 已提交
588
        test("zero value") {
589
          for {
梦境迷离's avatar
梦境迷离 已提交
590
            result <- ZIO.attempt(LongInput.encode(0L))
591
          } yield assert(result)(equalTo(RespCommand(Unknown("0"))))
592 593 594
        }
      ),
      suite("LongLat")(
梦境迷离's avatar
梦境迷离 已提交
595
        test("positive longitude and latitude") {
596
          for {
梦境迷离's avatar
梦境迷离 已提交
597
            result <- ZIO.attempt(LongLatInput.encode(LongLat(4.2d, 5.2d)))
598
          } yield assert(result)(equalTo(RespCommand(Unknown("4.2"), Unknown("5.2"))))
599
        },
梦境迷离's avatar
梦境迷离 已提交
600
        test("negative longitude and latitude") {
601
          for {
梦境迷离's avatar
梦境迷离 已提交
602
            result <- ZIO.attempt(LongLatInput.encode(LongLat(-4.2d, -5.2d)))
603
          } yield assert(result)(equalTo(RespCommand(Unknown("-4.2"), Unknown("-5.2"))))
604
        },
梦境迷离's avatar
梦境迷离 已提交
605
        test("zero longitude and latitude") {
606
          for {
梦境迷离's avatar
梦境迷离 已提交
607
            result <- ZIO.attempt(LongLatInput.encode(LongLat(0d, 0d)))
608
          } yield assert(result)(equalTo(RespCommand(Unknown("0.0"), Unknown("0.0"))))
609 610 611
        }
      ),
      suite("MemberScore")(
梦境迷离's avatar
梦境迷离 已提交
612
        test("with positive score and empty member") {
613
          for {
梦境迷离's avatar
梦境迷离 已提交
614
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(4.2d, "")))
615
          } yield assert(result)(equalTo(RespCommand(Unknown("4.2"), Value(""))))
616
        },
梦境迷离's avatar
梦境迷离 已提交
617
        test("with negative score and empty member") {
618
          for {
梦境迷离's avatar
梦境迷离 已提交
619
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(-4.2d, "")))
620
          } yield assert(result)(equalTo(RespCommand(Unknown("-4.2"), Value(""))))
621
        },
梦境迷离's avatar
梦境迷离 已提交
622
        test("with zero score and empty member") {
623
          for {
梦境迷离's avatar
梦境迷离 已提交
624
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(0d, "")))
625
          } yield assert(result)(equalTo(RespCommand(Unknown("0.0"), Value(""))))
626
        },
梦境迷离's avatar
梦境迷离 已提交
627
        test("with positive score and non-empty member") {
628
          for {
梦境迷离's avatar
梦境迷离 已提交
629
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(4.2d, "member")))
630
          } yield assert(result)(equalTo(RespCommand(Unknown("4.2"), Value("member"))))
631
        },
梦境迷离's avatar
梦境迷离 已提交
632
        test("with negative score and non-empty member") {
633
          for {
梦境迷离's avatar
梦境迷离 已提交
634
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(-4.2d, "member")))
635
          } yield assert(result)(equalTo(RespCommand(Unknown("-4.2"), Value("member"))))
636
        },
梦境迷离's avatar
梦境迷离 已提交
637
        test("with zero score and non-empty member") {
638
          for {
梦境迷离's avatar
梦境迷离 已提交
639
            result <- ZIO.attempt(MemberScoreInput[String]().encode(MemberScore(0d, "member")))
640
          } yield assert(result)(equalTo(RespCommand(Unknown("0.0"), Value("member"))))
641 642 643
        }
      ),
      suite("NoInput")(
梦境迷离's avatar
梦境迷离 已提交
644
        test("valid value") {
645
          for {
梦境迷离's avatar
梦境迷离 已提交
646
            result <- ZIO.attempt(NoInput.encode(()))
647
          } yield assert(result.args)(isEmpty)
648 649 650
        }
      ),
      suite("NonEmptyList")(
梦境迷离's avatar
梦境迷离 已提交
651
        test("with multiple elements") {
652
          for {
梦境迷离's avatar
梦境迷离 已提交
653
            result <- ZIO.attempt(NonEmptyList(StringInput).encode(("a", List("b", "c"))))
654
          } yield assert(result)(equalTo(RespCommand(Unknown("a"), Unknown("b"), Unknown("c"))))
655
        },
梦境迷离's avatar
梦境迷离 已提交
656
        test("with one element") {
657
          for {
梦境迷离's avatar
梦境迷离 已提交
658
            result <- ZIO.attempt(NonEmptyList(StringInput).encode(("a", List.empty)))
659
          } yield assert(result)(equalTo(RespCommand(Unknown("a"))))
660 661 662
        }
      ),
      suite("Order")(
梦境迷离's avatar
梦境迷离 已提交
663
        test("ascending") {
664
          for {
梦境迷离's avatar
梦境迷离 已提交
665
            result <- ZIO.attempt(OrderInput.encode(Ascending))
666
          } yield assert(result)(equalTo(RespCommand(Unknown("ASC"))))
667
        },
梦境迷离's avatar
梦境迷离 已提交
668
        test("descending") {
669
          for {
梦境迷离's avatar
梦境迷离 已提交
670
            result <- ZIO.attempt(OrderInput.encode(Descending))
671
          } yield assert(result)(equalTo(RespCommand(Unknown("DESC"))))
672 673 674
        }
      ),
      suite("RadiusUnit")(
梦境迷离's avatar
梦境迷离 已提交
675
        test("meters") {
676
          for {
梦境迷离's avatar
梦境迷离 已提交
677
            result <- ZIO.attempt(RadiusUnitInput.encode(Meters))
678
          } yield assert(result)(equalTo(RespCommand(Unknown("m"))))
679
        },
梦境迷离's avatar
梦境迷离 已提交
680
        test("kilometers") {
681
          for {
梦境迷离's avatar
梦境迷离 已提交
682
            result <- ZIO.attempt(RadiusUnitInput.encode(Kilometers))
683
          } yield assert(result)(equalTo(RespCommand(Unknown("km"))))
684
        },
梦境迷离's avatar
梦境迷离 已提交
685
        test("feet") {
686
          for {
梦境迷离's avatar
梦境迷离 已提交
687
            result <- ZIO.attempt(RadiusUnitInput.encode(Feet))
688
          } yield assert(result)(equalTo(RespCommand(Unknown("ft"))))
689
        },
梦境迷离's avatar
梦境迷离 已提交
690
        test("miles") {
691
          for {
梦境迷离's avatar
梦境迷离 已提交
692
            result <- ZIO.attempt(RadiusUnitInput.encode(Miles))
693
          } yield assert(result)(equalTo(RespCommand(Unknown("mi"))))
694 695 696
        }
      ),
      suite("Range")(
梦境迷离's avatar
梦境迷离 已提交
697
        test("with positive start and positive end") {
698
          for {
梦境迷离's avatar
梦境迷离 已提交
699
            result <- ZIO.attempt(RangeInput.encode(Range(1, 5)))
700
          } yield assert(result)(equalTo(RespCommand(Unknown("1"), Unknown("5"))))
701
        },
梦境迷离's avatar
梦境迷离 已提交
702
        test("with negative start and positive end") {
703
          for {
梦境迷离's avatar
梦境迷离 已提交
704
            result <- ZIO.attempt(RangeInput.encode(Range(-1, 5)))
705
          } yield assert(result)(equalTo(RespCommand(Unknown("-1"), Unknown("5"))))
706
        },
梦境迷离's avatar
梦境迷离 已提交
707
        test("with positive start and negative end") {
708
          for {
梦境迷离's avatar
梦境迷离 已提交
709
            result <- ZIO.attempt(RangeInput.encode(Range(1, -5)))
710
          } yield assert(result)(equalTo(RespCommand(Unknown("1"), Unknown("-5"))))
711
        },
梦境迷离's avatar
梦境迷离 已提交
712
        test("with negative start and negative end") {
713
          for {
梦境迷离's avatar
梦境迷离 已提交
714
            result <- ZIO.attempt(RangeInput.encode(Range(-1, -5)))
715
          } yield assert(result)(equalTo(RespCommand(Unknown("-1"), Unknown("-5"))))
716 717
        }
      ),
718
      suite("Pattern")(
梦境迷离's avatar
梦境迷离 已提交
719
        test("with valid pattern") {
720
          for {
梦境迷离's avatar
梦境迷离 已提交
721
            result <- ZIO.attempt(PatternInput.encode(Pattern("*[ab]-*")))
722
          } yield assert(result)(equalTo(RespCommand(Literal("MATCH"), Unknown("*[ab]-*"))))
723
        },
梦境迷离's avatar
梦境迷离 已提交
724
        test("with empty pattern") {
725
          for {
梦境迷离's avatar
梦境迷离 已提交
726
            result <- ZIO.attempt(PatternInput.encode(Pattern("")))
727
          } yield assert(result)(equalTo(RespCommand(Literal("MATCH"), Unknown(""))))
728 729 730
        }
      ),
      suite("Replace")(
梦境迷离's avatar
梦境迷离 已提交
731
        test("valid value") {
732
          for {
梦境迷离's avatar
梦境迷离 已提交
733
            result <- ZIO.attempt(ReplaceInput.encode(Replace))
734
          } yield assert(result)(equalTo(RespCommand(Literal("REPLACE"))))
735 736 737
        }
      ),
      suite("StoreDist")(
梦境迷离's avatar
梦境迷离 已提交
738
        test("with non-empty string") {
739
          for {
梦境迷离's avatar
梦境迷离 已提交
740
            result <- ZIO.attempt(StoreDistInput.encode(StoreDist("key")))
741
          } yield assert(result)(equalTo(RespCommand(Literal("STOREDIST"), Unknown("key"))))
742
        },
梦境迷离's avatar
梦境迷离 已提交
743
        test("with empty string") {
744
          for {
梦境迷离's avatar
梦境迷离 已提交
745
            result <- ZIO.attempt(StoreDistInput.encode(StoreDist("")))
746
          } yield assert(result)(equalTo(RespCommand(Literal("STOREDIST"), Unknown(""))))
747 748 749
        }
      ),
      suite("Store")(
梦境迷离's avatar
梦境迷离 已提交
750
        test("with non-empty string") {
751
          for {
梦境迷离's avatar
梦境迷离 已提交
752
            result <- ZIO.attempt(StoreInput.encode(Store("key")))
753
          } yield assert(result)(equalTo(RespCommand(Literal("STORE"), Unknown("key"))))
754
        },
梦境迷离's avatar
梦境迷离 已提交
755
        test("with empty string") {
756
          for {
梦境迷离's avatar
梦境迷离 已提交
757
            result <- ZIO.attempt(StoreInput.encode(Store("")))
758
          } yield assert(result)(equalTo(RespCommand(Literal("STORE"), Unknown(""))))
759 760 761
        }
      ),
      suite("ScoreRange")(
梦境迷离's avatar
梦境迷离 已提交
762
        test("with infinite min and infinite max") {
763
          for {
梦境迷离's avatar
梦境迷离 已提交
764
            result <- ZIO.attempt(
765
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
766
                          .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Infinity.asString))
A
Anatoly Sergeev 已提交
767
                      )
768
          } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("+inf"))))
769
        },
梦境迷离's avatar
梦境迷离 已提交
770
        test("with open min and infinite max") {
771
          for {
梦境迷离's avatar
梦境迷离 已提交
772
            result <- ZIO.attempt(
773
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
774
                          .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Infinity.asString))
A
Anatoly Sergeev 已提交
775
                      )
776
          } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("+inf"))))
777
        },
梦境迷离's avatar
梦境迷离 已提交
778
        test("with closed min and infinite max") {
779
          for {
梦境迷离's avatar
梦境迷离 已提交
780
            result <- ZIO.attempt(
781
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
782
                          .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Infinity.asString))
A
Anatoly Sergeev 已提交
783
                      )
784
          } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("+inf"))))
785
        },
梦境迷离's avatar
梦境迷离 已提交
786
        test("with infinite min and open max") {
787
          for {
梦境迷离's avatar
梦境迷离 已提交
788
            result <- ZIO.attempt(
789
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
790
                          .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Open(5.2d).asString))
A
Anatoly Sergeev 已提交
791
                      )
792
          } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("(5.2"))))
793
        },
梦境迷离's avatar
梦境迷离 已提交
794
        test("with open min and open max") {
795
          for {
梦境迷离's avatar
梦境迷离 已提交
796
            result <- ZIO.attempt(
797
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
798
                          .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Open(5.2d).asString))
A
Anatoly Sergeev 已提交
799
                      )
800
          } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("(5.2"))))
801
        },
梦境迷离's avatar
梦境迷离 已提交
802
        test("with closed min and open max") {
803
          for {
梦境迷离's avatar
梦境迷离 已提交
804
            result <- ZIO.attempt(
805
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
806
                          .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Open(5.2d).asString))
A
Anatoly Sergeev 已提交
807
                      )
808
          } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("(5.2"))))
809
        },
梦境迷离's avatar
梦境迷离 已提交
810
        test("with infinite min and closed max") {
811
          for {
梦境迷离's avatar
梦境迷离 已提交
812
            result <- ZIO.attempt(
813
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
814
                          .encode((ScoreMinimum.Infinity.asString, ScoreMaximum.Closed(5.2d).asString))
A
Anatoly Sergeev 已提交
815
                      )
816
          } yield assert(result)(equalTo(RespCommand(Value("-inf"), Value("5.2"))))
817
        },
梦境迷离's avatar
梦境迷离 已提交
818
        test("with open min and closed max") {
819
          for {
梦境迷离's avatar
梦境迷离 已提交
820
            result <- ZIO.attempt(
821
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
822
                          .encode((ScoreMinimum.Open(4.2d).asString, ScoreMaximum.Closed(5.2d).asString))
A
Anatoly Sergeev 已提交
823
                      )
824
          } yield assert(result)(equalTo(RespCommand(Value("(4.2"), Value("5.2"))))
825
        },
梦境迷离's avatar
梦境迷离 已提交
826
        test("with closed min and closed max") {
827
          for {
梦境迷离's avatar
梦境迷离 已提交
828
            result <- ZIO.attempt(
829
                        Tuple2(ArbitraryValueInput[String](), ArbitraryValueInput[String]())
830
                          .encode((ScoreMinimum.Closed(4.2d).asString, ScoreMaximum.Closed(5.2d).asString))
A
Anatoly Sergeev 已提交
831
                      )
832
          } yield assert(result)(equalTo(RespCommand(Value("4.2"), Value("5.2"))))
833 834
        }
      ),
835 836 837 838
      suite("ScriptDebug")(
        test("yes") {
          for {
            result <- ZIO.attempt(ScriptDebugInput.encode(DebugMode.Yes))
839
          } yield assert(result)(equalTo(RespCommand(Literal("YES"))))
840 841 842 843
        },
        test("sync") {
          for {
            result <- ZIO.attempt(ScriptDebugInput.encode(DebugMode.Sync))
844
          } yield assert(result)(equalTo(RespCommand(Literal("SYNC"))))
845 846 847 848
        },
        test("no") {
          for {
            result <- ZIO.attempt(ScriptDebugInput.encode(DebugMode.No))
849
          } yield assert(result)(equalTo(RespCommand(Literal("NO"))))
850 851 852 853 854 855
        }
      ),
      suite("ScriptFlush")(
        test("asynchronous") {
          for {
            result <- ZIO.attempt(ScriptFlushInput.encode(FlushMode.Async))
856
          } yield assert(result)(equalTo(RespCommand(Literal("ASYNC"))))
857 858 859 860
        },
        test("synchronous") {
          for {
            result <- ZIO.attempt(ScriptFlushInput.encode(FlushMode.Sync))
861
          } yield assert(result)(equalTo(RespCommand(Literal("SYNC"))))
862 863
        }
      ),
864
      suite("String")(
梦境迷离's avatar
梦境迷离 已提交
865
        test("non-empty value") {
866
          for {
梦境迷离's avatar
梦境迷离 已提交
867
            result <- ZIO.attempt(StringInput.encode("non-empty"))
868
          } yield assert(result)(equalTo(RespCommand(Unknown("non-empty"))))
869
        },
梦境迷离's avatar
梦境迷离 已提交
870
        test("empty value") {
871
          for {
梦境迷离's avatar
梦境迷离 已提交
872
            result <- ZIO.attempt(StringInput.encode(""))
873
          } yield assert(result)(equalTo(RespCommand(Unknown(""))))
874 875 876
        }
      ),
      suite("Optional")(
梦境迷离's avatar
梦境迷离 已提交
877
        test("none") {
878
          for {
梦境迷离's avatar
梦境迷离 已提交
879
            result <- ZIO.attempt(OptionalInput(LongInput).encode(None))
880
          } yield assert(result.args)(isEmpty)
881
        },
梦境迷离's avatar
梦境迷离 已提交
882
        test("some") {
883
          for {
梦境迷离's avatar
梦境迷离 已提交
884
            result <- ZIO.attempt(OptionalInput(LongInput).encode(Some(2L)))
885
          } yield assert(result)(equalTo(RespCommand(Unknown("2"))))
886 887 888
        }
      ),
      suite("TimeSeconds")(
梦境迷离's avatar
梦境迷离 已提交
889
        test("positiv value") {
890
          for {
梦境迷离's avatar
梦境迷离 已提交
891
            result <- ZIO.attempt(TimeSecondsInput.encode(Instant.ofEpochSecond(3L)))
892
          } yield assert(result)(equalTo(RespCommand(Unknown("3"))))
893
        },
梦境迷离's avatar
梦境迷离 已提交
894
        test("zero value") {
895
          for {
梦境迷离's avatar
梦境迷离 已提交
896
            result <- ZIO.attempt(TimeSecondsInput.encode(Instant.ofEpochSecond(0L)))
897
          } yield assert(result)(equalTo(RespCommand(Unknown("0"))))
898
        },
梦境迷离's avatar
梦境迷离 已提交
899
        test("negative value") {
900
          for {
梦境迷离's avatar
梦境迷离 已提交
901
            result <- ZIO.attempt(TimeSecondsInput.encode(Instant.ofEpochSecond(-3L)))
902
          } yield assert(result)(equalTo(RespCommand(Unknown("-3"))))
903 904 905
        }
      ),
      suite("TimeMilliseconds")(
梦境迷离's avatar
梦境迷离 已提交
906
        test("positiv value") {
907
          for {
梦境迷离's avatar
梦境迷离 已提交
908
            result <- ZIO.attempt(TimeMillisecondsInput.encode(Instant.ofEpochSecond(3L)))
909
          } yield assert(result)(equalTo(RespCommand(Unknown("3000"))))
910
        },
梦境迷离's avatar
梦境迷离 已提交
911
        test("zero value") {
912
          for {
梦境迷离's avatar
梦境迷离 已提交
913
            result <- ZIO.attempt(TimeMillisecondsInput.encode(Instant.ofEpochSecond(0L)))
914
          } yield assert(result)(equalTo(RespCommand(Unknown("0"))))
915
        },
梦境迷离's avatar
梦境迷离 已提交
916
        test("negative value") {
917
          for {
梦境迷离's avatar
梦境迷离 已提交
918
            result <- ZIO.attempt(TimeMillisecondsInput.encode(Instant.ofEpochSecond(-3L)))
919
          } yield assert(result)(equalTo(RespCommand(Unknown("-3000"))))
920 921 922
        }
      ),
      suite("Tuple2")(
梦境迷离's avatar
梦境迷离 已提交
923
        test("valid value") {
924
          for {
梦境迷离's avatar
梦境迷离 已提交
925
            result <- ZIO.attempt(Tuple2(StringInput, LongInput).encode(("one", 2L)))
926
          } yield assert(result)(equalTo(RespCommand(Unknown("one"), Unknown("2"))))
927 928 929
        }
      ),
      suite("Tuple3")(
梦境迷离's avatar
梦境迷离 已提交
930
        test("valid value") {
931
          for {
梦境迷离's avatar
梦境迷离 已提交
932
            result <- ZIO.attempt(Tuple3(StringInput, LongInput, StringInput).encode(("one", 2, "three")))
933
          } yield assert(result)(equalTo(RespCommand(Unknown("one"), Unknown("2"), Unknown("three"))))
934 935 936
        }
      ),
      suite("Tuple4")(
梦境迷离's avatar
梦境迷离 已提交
937
        test("valid value") {
938
          for {
梦境迷离's avatar
梦境迷离 已提交
939
            result <- ZIO.attempt(Tuple4(StringInput, LongInput, StringInput, LongInput).encode(("one", 2, "three", 4)))
940
          } yield assert(result)(equalTo(RespCommand(Unknown("one"), Unknown("2"), Unknown("three"), Unknown("4"))))
941 942 943
        }
      ),
      suite("Tuple5")(
梦境迷离's avatar
梦境迷离 已提交
944
        test("valid value") {
945
          for {
梦境迷离's avatar
梦境迷离 已提交
946
            result <- ZIO.attempt(
947 948 949 950
                        Tuple5(StringInput, LongInput, StringInput, LongInput, StringInput)
                          .encode(("one", 2, "three", 4, "five"))
                      )
          } yield assert(result)(
951
            equalTo(RespCommand(Unknown("one"), Unknown("2"), Unknown("three"), Unknown("4"), Unknown("five")))
952 953 954 955
          )
        }
      ),
      suite("Tuple7")(
梦境迷离's avatar
梦境迷离 已提交
956
        test("valid value") {
957
          for {
梦境迷离's avatar
梦境迷离 已提交
958
            result <- ZIO.attempt(
959 960 961 962 963
                        Tuple7(StringInput, LongInput, StringInput, LongInput, StringInput, LongInput, StringInput)
                          .encode(("one", 2, "three", 4, "five", 6, "seven"))
                      )
          } yield assert(result)(
            equalTo(
964 965 966 967 968 969 970 971
              RespCommand(
                Unknown("one"),
                Unknown("2"),
                Unknown("three"),
                Unknown("4"),
                Unknown("five"),
                Unknown("6"),
                Unknown("seven")
972 973 974 975 976 977
              )
            )
          )
        }
      ),
      suite("Tuple9")(
梦境迷离's avatar
梦境迷离 已提交
978
        test("valid value") {
979
          for {
梦境迷离's avatar
梦境迷离 已提交
980
            result <- ZIO.attempt(
981 982 983 984 985 986 987 988 989 990 991 992 993 994
                        Tuple9(
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput
                        ).encode(("one", 2, "three", 4, "five", 6, "seven", 8, "nine"))
                      )
          } yield assert(result)(
            equalTo(
995 996 997 998 999 1000 1001 1002 1003 1004
              RespCommand(
                Unknown("one"),
                Unknown("2"),
                Unknown("three"),
                Unknown("4"),
                Unknown("five"),
                Unknown("6"),
                Unknown("seven"),
                Unknown("8"),
                Unknown("nine")
1005 1006 1007 1008 1009 1010
              )
            )
          )
        }
      ),
      suite("Tuple11")(
梦境迷离's avatar
梦境迷离 已提交
1011
        test("valid value") {
1012
          for {
梦境迷离's avatar
梦境迷离 已提交
1013
            result <- ZIO.attempt(
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
                        Tuple11(
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput,
                          LongInput,
                          StringInput
                        ).encode(("one", 2, "three", 4, "five", 6, "seven", 8, "nine", 10, "eleven"))
                      )
          } yield assert(result)(
            equalTo(
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041
              RespCommand(
                Unknown("one"),
                Unknown("2"),
                Unknown("three"),
                Unknown("4"),
                Unknown("five"),
                Unknown("6"),
                Unknown("seven"),
                Unknown("8"),
                Unknown("nine"),
                Unknown("10"),
                Unknown("eleven")
1042 1043 1044 1045 1046 1047
              )
            )
          )
        }
      ),
      suite("Update")(
梦境迷离's avatar
梦境迷离 已提交
1048
        test("set existing") {
1049
          for {
梦境迷离's avatar
梦境迷离 已提交
1050
            result <- ZIO.attempt(UpdateInput.encode(Update.SetExisting))
1051
          } yield assert(result)(equalTo(RespCommand(Unknown("XX"))))
1052
        },
梦境迷离's avatar
梦境迷离 已提交
1053
        test("set new") {
1054
          for {
梦境迷离's avatar
梦境迷离 已提交
1055
            result <- ZIO.attempt(UpdateInput.encode(Update.SetNew))
1056
          } yield assert(result)(equalTo(RespCommand(Unknown("NX"))))
1057 1058
        }
      ),
1059
      suite("Id")(
梦境迷离's avatar
梦境迷离 已提交
1060
        test("valid value") {
1061
          for {
梦境迷离's avatar
梦境迷离 已提交
1062
            result <- ZIO.attempt(IdInput.encode(10))
1063
          } yield assert(result)(equalTo(RespCommand(Literal("ID"), Unknown("10"))))
1064 1065
        }
      ),
1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079
      suite("IDs")(
        test("with a single element") {
          for {
            result <- ZIO.attempt(IdsInput.encode((1, Nil)))
          } yield assert(result)(equalTo(RespCommand(Literal("ID"), Unknown("1"))))
        },
        test("with multiple elements") {
          for {
            result <- ZIO.attempt(IdsInput.encode((1, List(2, 3, 4))))
          } yield assert(result)(
            equalTo(RespCommand(Literal("ID"), Unknown("1"), Unknown("2"), Unknown("3"), Unknown("4")))
          )
        }
      ),
1080
      suite("UnblockBehavior")(
梦境迷离's avatar
梦境迷离 已提交
1081
        test("timeout") {
1082
          for {
梦境迷离's avatar
梦境迷离 已提交
1083
            result <- ZIO.attempt(UnblockBehaviorInput.encode(UnblockBehavior.Timeout))
1084
          } yield assert(result)(equalTo(RespCommand(Unknown("TIMEOUT"))))
1085
        },
梦境迷离's avatar
梦境迷离 已提交
1086
        test("error") {
1087
          for {
梦境迷离's avatar
梦境迷离 已提交
1088
            result <- ZIO.attempt(UnblockBehaviorInput.encode(UnblockBehavior.Error))
1089
          } yield assert(result)(equalTo(RespCommand(Unknown("ERROR"))))
1090 1091
        }
      ),
1092
      suite("Varargs")(
梦境迷离's avatar
梦境迷离 已提交
1093
        test("with multiple elements") {
1094
          for {
梦境迷离's avatar
梦境迷离 已提交
1095
            result <- ZIO.attempt(Varargs(LongInput).encode(List(1, 2, 3)))
1096
          } yield assert(result)(equalTo(RespCommand(Unknown("1"), Unknown("2"), Unknown("3"))))
1097
        },
梦境迷离's avatar
梦境迷离 已提交
1098
        test("with no elements") {
1099
          for {
梦境迷离's avatar
梦境迷离 已提交
1100
            result <- ZIO.attempt(Varargs(LongInput).encode(List.empty))
1101
          } yield assert(result.args)(isEmpty)
1102 1103 1104
        }
      ),
      suite("WithScores")(
梦境迷离's avatar
梦境迷离 已提交
1105
        test("valid value") {
1106
          for {
梦境迷离's avatar
梦境迷离 已提交
1107
            result <- ZIO.attempt(WithScoresInput.encode(WithScores))
1108
          } yield assert(result)(equalTo(RespCommand(Literal("WITHSCORES"))))
1109 1110 1111
        }
      ),
      suite("WithCoord")(
梦境迷离's avatar
梦境迷离 已提交
1112
        test("valid value") {
1113
          for {
梦境迷离's avatar
梦境迷离 已提交
1114
            result <- ZIO.attempt(WithCoordInput.encode(WithCoord))
1115
          } yield assert(result)(equalTo(RespCommand(Literal("WITHCOORD"))))
1116 1117 1118
        }
      ),
      suite("WithDist")(
梦境迷离's avatar
梦境迷离 已提交
1119
        test("valid value") {
1120
          for {
梦境迷离's avatar
梦境迷离 已提交
1121
            result <- ZIO.attempt(WithDistInput.encode(WithDist))
1122
          } yield assert(result)(equalTo(RespCommand(Literal("WITHDIST"))))
1123 1124 1125
        }
      ),
      suite("WithHash")(
梦境迷离's avatar
梦境迷离 已提交
1126
        test("valid value") {
1127
          for {
梦境迷离's avatar
梦境迷离 已提交
1128
            result <- ZIO.attempt(WithHashInput.encode(WithHash))
1129
          } yield assert(result)(equalTo(RespCommand(Literal("WITHHASH"))))
1130
        }
1131 1132
      ),
      suite("Idle")(
梦境迷离's avatar
梦境迷离 已提交
1133 1134 1135
        test("with 1 second") {
          ZIO
            .attempt(IdleInput.encode(1.second))
1136
            .map(assert(_)(equalTo(RespCommand(Literal("IDLE"), Unknown("1000")))))
1137
        },
梦境迷离's avatar
梦境迷离 已提交
1138 1139 1140
        test("with 100 milliseconds") {
          ZIO
            .attempt(IdleInput.encode(100.millis))
1141
            .map(assert(_)(equalTo(RespCommand(Literal("IDLE"), Unknown("100")))))
1142
        },
梦境迷离's avatar
梦境迷离 已提交
1143 1144 1145
        test("with negative duration") {
          ZIO
            .attempt(IdleInput.encode((-1).second))
1146
            .map(assert(_)(equalTo(RespCommand(Literal("IDLE"), Unknown("-1000")))))
1147 1148 1149
        }
      ),
      suite("Time")(
梦境迷离's avatar
梦境迷离 已提交
1150 1151 1152
        test("with 1 second") {
          ZIO
            .attempt(TimeInput.encode(1.second))
1153
            .map(assert(_)(equalTo(RespCommand(Literal("TIME"), Unknown("1000")))))
1154
        },
梦境迷离's avatar
梦境迷离 已提交
1155 1156 1157
        test("with 100 milliseconds") {
          ZIO
            .attempt(TimeInput.encode(100.millis))
1158
            .map(assert(_)(equalTo(RespCommand(Literal("TIME"), Unknown("100")))))
1159
        },
梦境迷离's avatar
梦境迷离 已提交
1160 1161 1162
        test("with negative duration") {
          ZIO
            .attempt(TimeInput.encode((-1).second))
1163
            .map(assert(_)(equalTo(RespCommand(Literal("TIME"), Unknown("-1000")))))
1164 1165 1166
        }
      ),
      suite("RetryCount")(
梦境迷离's avatar
梦境迷离 已提交
1167 1168 1169
        test("with positive count") {
          ZIO
            .attempt(RetryCountInput.encode(100))
1170
            .map(assert(_)(equalTo(RespCommand(Literal("RETRYCOUNT"), Unknown("100")))))
1171
        },
梦境迷离's avatar
梦境迷离 已提交
1172 1173 1174
        test("with negative count") {
          ZIO
            .attempt(RetryCountInput.encode(-100))
1175
            .map(assert(_)(equalTo(RespCommand(Literal("RETRYCOUNT"), Unknown("-100")))))
1176 1177 1178
        }
      ),
      suite("XGroupCreate")(
梦境迷离's avatar
梦境迷离 已提交
1179 1180 1181 1182 1183 1184
        test("without mkStream") {
          ZIO
            .attempt(
              XGroupCreateInput[String, String, String]().encode(
                XGroupCommand.Create("key", "group", "id", mkStream = false)
              )
A
Anatoly Sergeev 已提交
1185
            )
1186
            .map(assert(_)(equalTo(RespCommand(Literal("CREATE"), Key("key"), Unknown("group"), Unknown("id")))))
1187
        },
梦境迷离's avatar
梦境迷离 已提交
1188 1189 1190 1191 1192 1193
        test("with mkStream") {
          ZIO
            .attempt(
              XGroupCreateInput[String, String, String]().encode(
                XGroupCommand.Create("key", "group", "id", mkStream = true)
              )
A
Anatoly Sergeev 已提交
1194
            )
1195 1196 1197 1198 1199 1200 1201
            .map(
              assert(_)(
                equalTo(
                  RespCommand(Literal("CREATE"), Key("key"), Unknown("group"), Unknown("id"), Literal("MKSTREAM"))
                )
              )
            )
1202 1203 1204
        }
      ),
      suite("XGroupSetId")(
梦境迷离's avatar
梦境迷离 已提交
1205 1206 1207
        test("valid value") {
          ZIO
            .attempt(XGroupSetIdInput[String, String, String]().encode(XGroupCommand.SetId("key", "group", "id")))
1208
            .map(assert(_)(equalTo(RespCommand(Literal("SETID"), Key("key"), Unknown("group"), Unknown("id")))))
1209 1210 1211
        }
      ),
      suite("XGroupDestroy")(
梦境迷离's avatar
梦境迷离 已提交
1212 1213 1214
        test("valid value") {
          ZIO
            .attempt(XGroupDestroyInput[String, String]().encode(XGroupCommand.Destroy("key", "group")))
1215
            .map(assert(_)(equalTo(RespCommand(Literal("DESTROY"), Key("key"), Unknown("group")))))
1216 1217 1218
        }
      ),
      suite("XGroupCreateConsumer")(
梦境迷离's avatar
梦境迷离 已提交
1219 1220 1221 1222 1223 1224
        test("valid value") {
          ZIO
            .attempt(
              XGroupCreateConsumerInput[String, String, String]().encode(
                XGroupCommand.CreateConsumer("key", "group", "consumer")
              )
A
Anatoly Sergeev 已提交
1225
            )
1226 1227 1228 1229 1230
            .map(
              assert(_)(
                equalTo(RespCommand(Literal("CREATECONSUMER"), Key("key"), Unknown("group"), Unknown("consumer")))
              )
            )
1231 1232 1233
        }
      ),
      suite("XGroupDelConsumer")(
梦境迷离's avatar
梦境迷离 已提交
1234 1235 1236 1237 1238 1239
        test("valid value") {
          ZIO
            .attempt(
              XGroupDelConsumerInput[String, String, String]().encode(
                XGroupCommand.DelConsumer("key", "group", "consumer")
              )
A
Anatoly Sergeev 已提交
1240
            )
1241 1242 1243
            .map(
              assert(_)(equalTo(RespCommand(Literal("DELCONSUMER"), Key("key"), Unknown("group"), Unknown("consumer"))))
            )
1244 1245 1246
        }
      ),
      suite("Block")(
梦境迷离's avatar
梦境迷离 已提交
1247 1248 1249
        test("with 1 second") {
          ZIO
            .attempt(BlockInput.encode(1.second))
1250
            .map(assert(_)(equalTo(RespCommand(Literal("BLOCK"), Unknown("1000")))))
1251
        },
梦境迷离's avatar
梦境迷离 已提交
1252 1253 1254
        test("with 100 milliseconds") {
          ZIO
            .attempt(BlockInput.encode(100.millis))
1255
            .map(assert(_)(equalTo(RespCommand(Literal("BLOCK"), Unknown("100")))))
1256
        },
梦境迷离's avatar
梦境迷离 已提交
1257 1258 1259
        test("with negative duration") {
          ZIO
            .attempt(BlockInput.encode((-1).second))
1260
            .map(assert(_)(equalTo(RespCommand(Literal("BLOCK"), Unknown("-1000")))))
1261 1262 1263
        }
      ),
      suite("Streams")(
梦境迷离's avatar
梦境迷离 已提交
1264 1265 1266
        test("with one pair") {
          ZIO
            .attempt(StreamsInput[String, String]().encode(("a" -> "b", Chunk.empty)))
1267
            .map(assert(_)(equalTo(RespCommand(Literal("STREAMS"), Key("a"), Value("b")))))
1268
        },
梦境迷离's avatar
梦境迷离 已提交
1269 1270 1271
        test("with multiple pairs") {
          ZIO
            .attempt(StreamsInput[String, String]().encode(("a" -> "b", Chunk.single("c" -> "d"))))
1272
            .map(assert(_)(equalTo(RespCommand(Literal("STREAMS"), Key("a"), Key("c"), Value("b"), Value("d")))))
1273 1274 1275
        }
      ),
      suite("NoAck")(
梦境迷离's avatar
梦境迷离 已提交
1276
        test("valid value") {
1277
          ZIO.attempt(NoAckInput.encode(NoAck)).map(assert(_)(equalTo(RespCommand(Unknown("NOACK")))))
1278 1279 1280
        }
      ),
      suite("MaxLen")(
梦境迷离's avatar
梦境迷离 已提交
1281 1282 1283
        test("with approximate") {
          ZIO
            .attempt(StreamMaxLenInput.encode(StreamMaxLen(approximate = true, 10)))
1284
            .map(assert(_)(equalTo(RespCommand(Literal("MAXLEN"), Literal("~"), Unknown("10")))))
1285
        },
梦境迷离's avatar
梦境迷离 已提交
1286 1287 1288
        test("without approximate") {
          ZIO
            .attempt(StreamMaxLenInput.encode(StreamMaxLen(approximate = false, 10)))
1289
            .map(assert(_)(equalTo(RespCommand(Literal("MAXLEN"), Unknown("10")))))
1290 1291 1292
        }
      ),
      suite("WithForce")(
梦境迷离's avatar
梦境迷离 已提交
1293
        test("valid value") {
1294
          ZIO.attempt(WithForceInput.encode(WithForce)).map(assert(_)(equalTo(RespCommand(Literal("FORCE")))))
1295 1296 1297
        }
      ),
      suite("WithJustId")(
梦境迷离's avatar
梦境迷离 已提交
1298
        test("valid value") {
1299
          ZIO.attempt(WithJustIdInput.encode(WithJustId)).map(assert(_)(equalTo(RespCommand(Literal("JUSTID")))))
1300
        }
1301 1302
      ),
      suite("Side")(
梦境迷离's avatar
梦境迷离 已提交
1303
        test("left") {
1304
          for {
梦境迷离's avatar
梦境迷离 已提交
1305
            result <- ZIO.attempt(SideInput.encode(Side.Left))
1306
          } yield assert(result)(equalTo(RespCommand(Literal("LEFT"))))
1307
        },
梦境迷离's avatar
梦境迷离 已提交
1308
        test("right") {
1309
          for {
梦境迷离's avatar
梦境迷离 已提交
1310
            result <- ZIO.attempt(SideInput.encode(Side.Right))
1311
          } yield assert(result)(equalTo(RespCommand(Literal("RIGHT"))))
1312
        }
H
Hans Christian Wilhelm 已提交
1313 1314
      ),
      suite("ListMaxLen")(
梦境迷离's avatar
梦境迷离 已提交
1315
        test("valid value") {
1316 1317 1318
          ZIO
            .attempt(ListMaxLenInput.encode(ListMaxLen(10L)))
            .map(assert(_)(equalTo(RespCommand(Literal("MAXLEN"), Unknown("10")))))
H
Hans Christian Wilhelm 已提交
1319 1320 1321
        }
      ),
      suite("Rank")(
梦境迷离's avatar
梦境迷离 已提交
1322
        test("valid value") {
1323
          ZIO.attempt(RankInput.encode(Rank(10L))).map(assert(_)(equalTo(RespCommand(Literal("RANK"), Unknown("10")))))
H
Hans Christian Wilhelm 已提交
1324
        }
梦境迷离's avatar
梦境迷离 已提交
1325 1326
      ),
      suite("GetEx")(
梦境迷离's avatar
梦境迷离 已提交
1327
        test("GetExInput - valid value") {
梦境迷离's avatar
梦境迷离 已提交
1328 1329
          for {
            resultSeconds <-
梦境迷离's avatar
梦境迷离 已提交
1330
              ZIO.attempt(GetExInput[String]().encode(scala.Tuple3.apply("key", Expire.SetExpireSeconds, 1.second)))
梦境迷离's avatar
梦境迷离 已提交
1331
            resultMilliseconds <-
梦境迷离's avatar
梦境迷离 已提交
1332
              ZIO.attempt(GetExInput[String]().encode(scala.Tuple3("key", Expire.SetExpireMilliseconds, 100.millis)))
1333 1334 1335 1336
          } yield assert(resultSeconds)(equalTo(RespCommand(Key("key"), Literal("EX"), Unknown("1")))) && assert(
            resultMilliseconds
          )(
            equalTo(RespCommand(Key("key"), Literal("PX"), Unknown("100")))
梦境迷离's avatar
梦境迷离 已提交
1337 1338
          )
        },
梦境迷离's avatar
梦境迷离 已提交
1339
        test("GetExAtInput - valid value") {
梦境迷离's avatar
梦境迷离 已提交
1340 1341
          for {
            resultSeconds <-
梦境迷离's avatar
梦境迷离 已提交
1342
              ZIO.attempt(
梦境迷离's avatar
梦境迷离 已提交
1343 1344 1345 1346 1347
                GetExAtInput[String]().encode(
                  scala.Tuple3("key", ExpiredAt.SetExpireAtSeconds, Instant.parse("2021-04-06T00:00:00Z"))
                )
              )
            resultMilliseconds <-
梦境迷离's avatar
梦境迷离 已提交
1348
              ZIO.attempt(
梦境迷离's avatar
梦境迷离 已提交
1349 1350 1351 1352
                GetExAtInput[String]().encode(
                  scala.Tuple3("key", ExpiredAt.SetExpireAtMilliseconds, Instant.parse("2021-04-06T00:00:00Z"))
                )
              )
1353 1354 1355 1356
          } yield assert(resultSeconds)(
            equalTo(RespCommand(Key("key"), Literal("EXAT"), Unknown("1617667200")))
          ) && assert(resultMilliseconds)(
            equalTo(RespCommand(Key("key"), Literal("PXAT"), Unknown("1617667200000")))
梦境迷离's avatar
梦境迷离 已提交
1357 1358
          )
        },
梦境迷离's avatar
梦境迷离 已提交
1359
        test("GetExPersistInput - valid value") {
梦境迷离's avatar
梦境迷离 已提交
1360
          for {
梦境迷离's avatar
梦境迷离 已提交
1361 1362
            result              <- ZIO.attempt(GetExPersistInput[String]().encode("key" -> true))
            resultWithoutOption <- ZIO.attempt(GetExPersistInput[String]().encode("key" -> false))
1363 1364
          } yield assert(result)(equalTo(RespCommand(Key("key"), Literal("PERSIST")))) &&
            assert(resultWithoutOption)(equalTo(RespCommand(Key("key"))))
梦境迷离's avatar
梦境迷离 已提交
1365
        }
1366 1367
      ),
      suite("YesNo")(
梦境迷离's avatar
梦境迷离 已提交
1368
        test("yes") {
1369
          for {
梦境迷离's avatar
梦境迷离 已提交
1370
            result <- ZIO.attempt(YesNoInput.encode(true))
1371
          } yield assert(result)(equalTo(RespCommand(Literal("YES"))))
1372
        },
梦境迷离's avatar
梦境迷离 已提交
1373
        test("no") {
1374
          for {
梦境迷离's avatar
梦境迷离 已提交
1375
            result <- ZIO.attempt(YesNoInput.encode(false))
1376
          } yield assert(result)(equalTo(RespCommand(Literal("NO"))))
1377
        }
1378 1379 1380
      )
    )
}