Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions ramda/private/_equals.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
from math import isnan

from ._helper import getAttribute
from ._helper import getAttribute, isNegativeFloatZero
from ._isArrayLike import _isArrayLike
from ._isFunction import _isFunction
from ._isNumber import _isNumber


def _equals(a, b):
if _isNumber(a) and isnan(a) and _isNumber(b) and isnan(b):
return True
if _isNumber(a) and _isNumber(b):
if isnan(a) and isnan(b):
return True
if a == 0 and b == 0:
return isNegativeFloatZero(a) == isNegativeFloatZero(b)
# pylint: disable=unidiomatic-typecheck
if type(a) != type(b):
return False
Expand Down
6 changes: 6 additions & 0 deletions ramda/private/_helper.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@

import math

from ._has import _has
from ._isArrayLike import _isArrayLike

Expand Down Expand Up @@ -76,3 +78,7 @@ def safeLen(x):
if _isArrayLike(x):
return len(x)
return 0


def isNegativeFloatZero(n):
return n == 0 and math.atan2(0.0, 0.0) != math.atan2(0.0, n)
1 change: 0 additions & 1 deletion ramda/uniqBy.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ def inner_uniqBy(fn, arr):
item = arr[idx]
appliedItem = fn(item)
if _set.add(appliedItem):
print(appliedItem, _set)
result.append(item)
idx += 1
return result
Expand Down
18 changes: 18 additions & 0 deletions test/private/test__helper.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@

import unittest

from ramda.private._helper import isNegativeFloatZero


class Test_Helper(unittest.TestCase):
def test_isNegativeZero(self):
self.assertEqual(True, isNegativeFloatZero(-0.0))
self.assertEqual(False, isNegativeFloatZero(-0))
self.assertEqual(False, isNegativeFloatZero(0))
self.assertEqual(False, isNegativeFloatZero(0.0))
self.assertEqual(False, isNegativeFloatZero(-0.1))
self.assertEqual(False, isNegativeFloatZero(0.1))


if __name__ == '__main__':
unittest.main()
1 change: 0 additions & 1 deletion test/test_constructN.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@

class Circle:
def __init__(self, r, *args):
print(args)
self.r = r
self.colors = list(args)

Expand Down
3 changes: 1 addition & 2 deletions test/test_difference.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ def test_does_not_allow_duplicates_in_the_output_even_if_the_input_lists_had_dup
self.assertEqual([1, 2], R.difference(M2, N2))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
# self.assertEqual(1, len(R.difference([0], [-0])))
self.assertEqual(1, len(R.difference([0.0], [-0.0])))
self.assertEqual(0, len(R.difference([float('nan')], [float('nan')])))
self.assertEqual(0, len(R.difference([Just([42])], [Just([42])])))

Expand Down
4 changes: 0 additions & 4 deletions test/test_equals.py
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,6 @@ def equals(self, point):
self.assertEqual(False, R.equals(Point(1, 2), ColorPoint(1, 2, 'red')))
self.assertEqual(False, R.equals(ColorPoint(1, 2, 'red'), Point(1, 2)))

def test_clone(self):
pass
#TODO: clone

def test_nan(self):
self.assertEqual(True, R.equals(float('nan'), float('nan')))

Expand Down
3 changes: 1 addition & 2 deletions test/test_indexOf.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ def test_returns_minus_1_for_an_empty_array(self):
self.assertEqual(-1, R.indexOf('x', []))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
# self.assertEqual(1, len(R.difference([0], [-0])))
self.assertEqual(1, len(R.difference([0.0], [-0.0])))
self.assertEqual(0, R.indexOf(float('nan'), [float('nan')]))
self.assertEqual(0, R.indexOf(Just([42]), [Just([42])]))

Expand Down
3 changes: 2 additions & 1 deletion test/test_intersection.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ def test_does_not_allow_duplicates_in_the_output_even_if_the_second_lists_is_big
self.assertEqual([3, 4], R.intersection(M, N2))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simplicity
self.assertEqual(0, len(R.intersection([0.0], [-0.0])))
self.assertEqual(0, len(R.intersection([-0.0], [0.0])))
self.assertEqual(1, len(R.intersection([float('nan')], [float('nan')])))
self.assertEqual(1, len(R.intersection([Just([42])], [Just([42])])))

Expand Down
3 changes: 1 addition & 2 deletions test/test_lastIndexOf.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ def test_returns_minus_1_for_an_empty_array(self):
self.assertEqual(-1, R.lastIndexOf('x', []))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
# self.assertEqual(-1, R.lastIndexOf(0, [-0]))
self.assertEqual(-1, R.lastIndexOf(0.0, [-0.0]))
self.assertEqual(0, R.lastIndexOf(float('nan'), [float('nan')]))
self.assertEqual(0, R.lastIndexOf(Just([42]), [Just([42])]))

Expand Down
3 changes: 2 additions & 1 deletion test/test_propEq.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@

class TestPropEq(unittest.TestCase):
def test_has_R_equals_semantics(self):
# TODO: handle minus zero
self.assertEqual(False, R.propEq(0.0, 'value', {'value': -0.0}))
self.assertEqual(False, R.propEq(-0.0, 'value', {'value': 0.0}))
self.assertEqual(True, R.propEq(float('nan'), 'value', {'value': float('nan')}))
self.assertEqual(True, R.propEq(Just([42]), 'value', {'value': Just([42])}))

Expand Down
1 change: 0 additions & 1 deletion test/test_tap.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ def test_dispatches_to_transformer_objects(self):
appendToSideEffect = appendToList(sideEffect)

res = R.tap(appendToSideEffect, listXf)
print(res)
self.assertEqual(appendToSideEffect, res.f)
self.assertEqual(listXf, res.xf)

Expand Down
4 changes: 3 additions & 1 deletion test/test_toString.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ def test_returns_the_string_representation_of_a_Boolean_primitive(self):

def test_returns_the_string_representation_of_a_number_primitive(self):
self.assertEqual('0', R.toString(0))
# TODO: -0
self.assertEqual('0', R.toString(-0))
self.assertEqual('0.0', R.toString(0.0))
self.assertEqual('-0.0', R.toString(-0.0))
self.assertEqual('1.23', R.toString(1.23))
self.assertEqual('-1.23', R.toString(-1.23))
self.assertEqual('1e+23', R.toString(1e+23))
Expand Down
3 changes: 2 additions & 1 deletion test/test_union.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ def test_combines_two_lists_into_the_set_of_all_their_elements(self):
self.assertEqual([1, 2, 3, 4, 5, 6], R.union(M, N))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
self.assertEqual(2, len(R.union([0.0], [-0.0])))
self.assertEqual(2, len(R.union([-0.0], [0.0])))
self.assertEqual(1, len(R.union([float('nan')], [float('nan')])))
self.assertEqual(1, len(R.union([Just([42])], [Just([42])])))

Expand Down
4 changes: 2 additions & 2 deletions test/test_uniq.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ def test_returns_an_empty_array_for_an_empty_array(self):
self.assertEqual([], R.uniq([]))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
# self.assertEqual(2, len(R.uniq([0], [-0])))
self.assertEqual(1, len(R.uniq([-0.0, -0.0])))
self.assertEqual(2, len(R.uniq([0.0, -0.0])))
self.assertEqual(1, len(R.uniq([float('nan'), float('nan')])))
# self.assertEqual(1, len(R.uniq([[1], [1]]))) # python only support hashable obj
self.assertEqual(1, len(R.uniq([Just([42]), Just([42])])))
Expand Down
3 changes: 1 addition & 2 deletions test/test_uniqBy.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ def test_returns_an_empty_array_for_an_empty_array(self):
self.assertEqual([], R.uniqBy(R.identity, []))

def test_has_R_equals_semantics(self):
# TODO: ignore neg-zero and pos-zero check for now, due to simlicity
# self.assertEqual(2, len(R.uniqBy([0], [-0])))
self.assertEqual(2, len(R.uniqBy(R.identity, [0.0, -0.0])))
self.assertEqual(1, len(R.uniqBy(R.identity, [float('nan'), float('nan')])))
self.assertEqual(1, len(R.uniqBy(R.identity, [Just([1, 2, 3]), Just([1, 2, 3])])))

Expand Down