test_tan.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import math
  2. from decimal import Decimal
  3. from django.db.models import DecimalField
  4. from django.db.models.functions import Tan
  5. from django.test import TestCase
  6. from django.test.utils import register_lookup
  7. from ..models import DecimalModel, FloatModel, IntegerModel
  8. class TanTests(TestCase):
  9. def test_decimal(self):
  10. DecimalModel.objects.create(n1=Decimal('-12.9'), n2=Decimal('0.6'))
  11. obj = DecimalModel.objects.annotate(n1_tan=Tan('n1'), n2_tan=Tan('n2')).first()
  12. self.assertIsInstance(obj.n1_tan, Decimal)
  13. self.assertIsInstance(obj.n2_tan, Decimal)
  14. self.assertAlmostEqual(obj.n1_tan, Decimal(math.tan(obj.n1)))
  15. self.assertAlmostEqual(obj.n2_tan, Decimal(math.tan(obj.n2)))
  16. def test_float(self):
  17. FloatModel.objects.create(f1=-27.5, f2=0.33)
  18. obj = FloatModel.objects.annotate(f1_tan=Tan('f1'), f2_tan=Tan('f2')).first()
  19. self.assertIsInstance(obj.f1_tan, float)
  20. self.assertIsInstance(obj.f2_tan, float)
  21. self.assertAlmostEqual(obj.f1_tan, math.tan(obj.f1))
  22. self.assertAlmostEqual(obj.f2_tan, math.tan(obj.f2))
  23. def test_integer(self):
  24. IntegerModel.objects.create(small=-20, normal=15, big=-1)
  25. obj = IntegerModel.objects.annotate(
  26. small_tan=Tan('small'),
  27. normal_tan=Tan('normal'),
  28. big_tan=Tan('big'),
  29. ).first()
  30. self.assertIsInstance(obj.small_tan, float)
  31. self.assertIsInstance(obj.normal_tan, float)
  32. self.assertIsInstance(obj.big_tan, float)
  33. self.assertAlmostEqual(obj.small_tan, math.tan(obj.small))
  34. self.assertAlmostEqual(obj.normal_tan, math.tan(obj.normal))
  35. self.assertAlmostEqual(obj.big_tan, math.tan(obj.big))
  36. def test_transform(self):
  37. with register_lookup(DecimalField, Tan):
  38. DecimalModel.objects.create(n1=Decimal('0.0'), n2=Decimal('0'))
  39. DecimalModel.objects.create(n1=Decimal('12.0'), n2=Decimal('0'))
  40. objs = DecimalModel.objects.filter(n1__tan__lt=0)
  41. self.assertQuerysetEqual(objs, [Decimal('12.0')], lambda a: a.n1)