xref: /redis-3.2.3/tests/unit/type/incr.tcl (revision 954151f6)
1start_server {tags {"incr"}} {
2    test {INCR against non existing key} {
3        set res {}
4        append res [r incr novar]
5        append res [r get novar]
6    } {11}
7
8    test {INCR against key created by incr itself} {
9        r incr novar
10    } {2}
11
12    test {INCR against key originally set with SET} {
13        r set novar 100
14        r incr novar
15    } {101}
16
17    test {INCR over 32bit value} {
18        r set novar 17179869184
19        r incr novar
20    } {17179869185}
21
22    test {INCRBY over 32bit value with over 32bit increment} {
23        r set novar 17179869184
24        r incrby novar 17179869184
25    } {34359738368}
26
27    test {INCR fails against key with spaces (left)} {
28        r set novar "    11"
29        catch {r incr novar} err
30        format $err
31    } {ERR*}
32
33    test {INCR fails against key with spaces (right)} {
34        r set novar "11    "
35        catch {r incr novar} err
36        format $err
37    } {ERR*}
38
39    test {INCR fails against key with spaces (both)} {
40        r set novar "    11    "
41        catch {r incr novar} err
42        format $err
43    } {ERR*}
44
45    test {INCR fails against a key holding a list} {
46        r rpush mylist 1
47        catch {r incr mylist} err
48        r rpop mylist
49        format $err
50    } {WRONGTYPE*}
51
52    test {DECRBY over 32bit value with over 32bit increment, negative res} {
53        r set novar 17179869184
54        r decrby novar 17179869185
55    } {-1}
56
57    test {INCR uses shared objects in the 0-9999 range} {
58        r set foo -1
59        r incr foo
60        assert {[r object refcount foo] > 1}
61        r set foo 9998
62        r incr foo
63        assert {[r object refcount foo] > 1}
64        r incr foo
65        assert {[r object refcount foo] == 1}
66    }
67
68    test {INCR can modify objects in-place} {
69        r set foo 20000
70        r incr foo
71        assert {[r object refcount foo] == 1}
72        set old [lindex [split [r debug object foo]] 1]
73        r incr foo
74        set new [lindex [split [r debug object foo]] 1]
75        assert {[string range $old 0 2] eq "at:"}
76        assert {[string range $new 0 2] eq "at:"}
77        assert {$old eq $new}
78    }
79
80    test {INCRBYFLOAT against non existing key} {
81        r del novar
82        list    [roundFloat [r incrbyfloat novar 1]] \
83                [roundFloat [r get novar]] \
84                [roundFloat [r incrbyfloat novar 0.25]] \
85                [roundFloat [r get novar]]
86    } {1 1 1.25 1.25}
87
88    test {INCRBYFLOAT against key originally set with SET} {
89        r set novar 1.5
90        roundFloat [r incrbyfloat novar 1.5]
91    } {3}
92
93    test {INCRBYFLOAT over 32bit value} {
94        r set novar 17179869184
95        r incrbyfloat novar 1.5
96    } {17179869185.5}
97
98    test {INCRBYFLOAT over 32bit value with over 32bit increment} {
99        r set novar 17179869184
100        r incrbyfloat novar 17179869184
101    } {34359738368}
102
103    test {INCRBYFLOAT fails against key with spaces (left)} {
104        set err {}
105        r set novar "    11"
106        catch {r incrbyfloat novar 1.0} err
107        format $err
108    } {ERR*valid*}
109
110    test {INCRBYFLOAT fails against key with spaces (right)} {
111        set err {}
112        r set novar "11    "
113        catch {r incrbyfloat novar 1.0} err
114        format $err
115    } {ERR*valid*}
116
117    test {INCRBYFLOAT fails against key with spaces (both)} {
118        set err {}
119        r set novar " 11 "
120        catch {r incrbyfloat novar 1.0} err
121        format $err
122    } {ERR*valid*}
123
124    test {INCRBYFLOAT fails against a key holding a list} {
125        r del mylist
126        set err {}
127        r rpush mylist 1
128        catch {r incrbyfloat mylist 1.0} err
129        r del mylist
130        format $err
131    } {WRONGTYPE*}
132
133    test {INCRBYFLOAT does not allow NaN or Infinity} {
134        r set foo 0
135        set err {}
136        catch {r incrbyfloat foo +inf} err
137        set err
138        # p.s. no way I can force NaN to test it from the API because
139        # there is no way to increment / decrement by infinity nor to
140        # perform divisions.
141    } {ERR*would produce*}
142
143    test {INCRBYFLOAT decrement} {
144        r set foo 1
145        roundFloat [r incrbyfloat foo -1.1]
146    } {-0.1}
147}
148