Skip to content

Commit 4cd324c

Browse files
committed
improve coverage
1 parent 6109ee6 commit 4cd324c

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

unpythonic/seq.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def pipe1(value0, *bodys):
145145

146146
class Getvalue(Singleton): # singleton sentinel with a nice repr
147147
"""Sentinel; pipe into this to exit a shell-like pipe and return the current value."""
148-
def __repr__(self):
148+
def __repr__(self): # pragma: no cover
149149
return "<sentinel for pipe exit>"
150150
getvalue = Getvalue()
151151
runpipe = getvalue # same thing as getvalue, but semantically better name for lazy pipes
@@ -185,7 +185,7 @@ def __or__(self, f):
185185
return self._x
186186
cls = self.__class__
187187
return cls(f(self._x)) # functional update
188-
def __repr__(self):
188+
def __repr__(self): # pragma: no cover
189189
return "<piped1 at 0x{:x}; value {}>".format(id(self), self._x)
190190

191191
class lazy_piped1:
@@ -247,7 +247,7 @@ def nextfibo(state):
247247
# just pass on the reference to the original x.
248248
cls = self.__class__
249249
return cls(x=self._x, _funcs=self._funcs + (f,))
250-
def __repr__(self):
250+
def __repr__(self): # pragma: no cover
251251
return "<lazy_piped1 at 0x{:x}; initial value now {}, functions {}>".format(id(self), self._x, self._funcs)
252252

253253
def pipe(values0, *bodys):
@@ -330,14 +330,12 @@ def __or__(self, f):
330330
if f is exitpipe:
331331
return xs if len(xs) > 1 else xs[0]
332332
cls = self.__class__
333-
if isinstance(xs, tuple):
334-
newxs = f(*xs)
335-
else:
336-
newxs = f(xs)
333+
assert isinstance(xs, tuple) # __init__ ensures this
334+
newxs = f(*xs)
337335
if isinstance(newxs, tuple):
338336
return cls(*newxs)
339337
return cls(newxs)
340-
def __repr__(self):
338+
def __repr__(self): # pragma: no cover
341339
return "<piped at 0x{:x}; values {}>".format(id(self), self._xs)
342340

343341
class lazy_piped:
@@ -379,11 +377,14 @@ def __or__(self, f):
379377
vs = g(*vs)
380378
else:
381379
vs = g(vs)
382-
return vs if len(vs) > 1 else vs[0]
380+
if isinstance(vs, tuple):
381+
return vs if len(vs) > 1 else vs[0]
382+
else:
383+
return vs
383384
# just pass on the references to the original xs.
384385
cls = self.__class__
385386
return cls(*self._xs, _funcs=self._funcs + (f,))
386-
def __repr__(self):
387+
def __repr__(self): # pragma: no cover
387388
return "<lazy_piped at 0x{:x}; initial values now {}, functions {}>".format(id(self), self._xs, self._funcs)
388389

389390
# do(): improved begin() that can name intermediate results and refer to them
@@ -485,7 +486,7 @@ def maybe_call(v):
485486
try:
486487
if not arity_includes(v, 1):
487488
raise ValueError("Arity mismatch; callable value must allow arity 1, to take in the environment.")
488-
except UnknownArity: # well, we tried!
489+
except UnknownArity: # well, we tried! # pragma: no cover
489490
pass
490491
return v(e)
491492
return v

unpythonic/test/test_seq.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ def runtests():
2727
lambda: print("cheeky side effect"))
2828
test[f4(2) == 84]
2929

30+
# special cases
31+
test[lazy_begin() is None]
32+
test[lazy_begin(lambda: 42) == 42]
33+
test[lazy_begin0() is None]
34+
test[lazy_begin0(lambda: 42) == 42]
35+
3036
# pipe: sequence functions
3137
with testset("pipe (sequence functions)"):
3238
double = lambda x: 2 * x
@@ -127,6 +133,9 @@ def nextfibo(a, b): # now two arguments
127133
p | exitpipe
128134
test[fibos == [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]]
129135

136+
# abuse multi-arg version for single-arg case
137+
test[lazy_piped(42) | double | inc | exitpipe == 85]
138+
130139
# do: improved begin() that can name intermediate results
131140
with testset("do (code imperatively in expressions)"):
132141
y = do(assign(x=17),
@@ -194,6 +203,10 @@ def nextfibo(a, b): # now two arguments
194203
lambda e: fail["This line should not be reached."])) # and this (as above) # pragma: no cover
195204
test[z == 42]
196205

206+
with testset("do error cases"):
207+
test_raises[ValueError, do(lambda e: assign(x=2, y=3))] # expect only one binding per assign()
208+
test_raises[ValueError, do(lambda: 42)] # missing the env parameter
209+
197210
if __name__ == '__main__': # pragma: no cover
198211
with session(__file__):
199212
runtests()

0 commit comments

Comments
 (0)