earthengine-api/python/ee/tests/computedobject_test.py
Google Earth Engine Authors cdfe00b9d8 v0.1.388
PiperOrigin-RevId: 601829646
2024-01-31 22:47:46 +00:00

143 lines
4.5 KiB
Python

#!/usr/bin/env python3
"""Test for the ee.computedobject module."""
import json
from unittest import mock
import ee
from ee import apitestcase
from ee import computedobject
import unittest
class ComputedObjectTest(apitestcase.ApiTestCase):
def test_metaclass_call_self_casting(self):
number = ee.Number(1)
# This exercises the self-cast case of ComputedObjectMetaclass.__call__.
result = ee.Number(number)
self.assertIs(result, number)
def test_computed_object(self):
"""Verifies that untyped calls wrap the result in a ComputedObject."""
result = ee.ApiFunction.call_('DateRange', 1, 2)
serialized = result.serialize()
self.assertIsInstance(serialized, str)
expected = {
'result': '0',
'values': {
'0': {
'functionInvocationValue': {
'functionName': 'DateRange',
'arguments': {
'end': {'constantValue': 2},
'start': {'constantValue': 1},
},
}
}
},
}
self.assertEqual(expected, json.loads(serialized))
self.assertEqual({'value': 'fakeValue'}, result.getInfo())
def test_internals(self):
"""Test eq(), ne() and hash()."""
a = ee.ApiFunction.call_('DateRange', 1, 2)
b = ee.ApiFunction.call_('DateRange', 2, 3)
c = ee.ApiFunction.call_('DateRange', 1, 2)
self.assertEqual(a, a)
self.assertNotEqual(a, b)
self.assertEqual(a, c)
self.assertNotEqual(b, c)
self.assertNotEqual(hash(a), hash(b))
def test_bad_init_with_both_func_and_var(self):
message = 'When "varName" is specified, "func" and "args" must be null.'
with self.assertRaisesRegex(ee.EEException, message):
computedobject.ComputedObject(None, {'dummy': 'arg'}, 'variable name')
func = ee.ApiFunction.lookup('Date')
with self.assertRaisesRegex(ee.EEException, message):
computedobject.ComputedObject(func, None, 'variable name')
def test_encoder_must_not_be_none_for_non_variable(self):
an_object = computedobject.ComputedObject(None, {'dummy': 'arg'})
with self.assertRaisesRegex(
ValueError, 'encoder can only be none when encode is for a variable.'
):
an_object.encode(None)
def test_encode_variable(self):
var_name = 'variable name'
an_object = computedobject.ComputedObject(None, None, var_name)
expect = {'type': 'ArgumentRef', 'value': var_name}
self.assertEqual(expect, an_object.encode(None))
# TODO(user): test_encode_function
def test_encode_cloud_value_variable(self):
var_name = 'variable name'
an_object = computedobject.ComputedObject(None, None, var_name)
expect = {'argumentReference': var_name}
self.assertEqual(expect, an_object.encode_cloud_value(None))
# TODO(user): test_encode_cloud_value_variable_ref_is_none
# TODO(user): test_encode_cloud_value_str_func
def test_str_variable(self):
var_name = 'variable name'
obj = computedobject.ComputedObject(None, None, var_name)
expect = f'ee.ComputedObject({{\n "argumentReference": "{var_name}"\n}})'
self.assertEqual(expect, str(obj))
def test_str_function(self):
sine = ee.Number(1).sin()
expect = (
'ee.Number({\n'
' "functionInvocationValue": {\n'
' "functionName": "Number.sin",\n'
' "arguments": {\n'
' "input": {\n'
' "constantValue": 1\n'
' }\n'
' }\n'
' }\n'
'})'
)
self.assertEqual(expect, str(sine))
def test_aside(self):
mock_function = mock.Mock(return_value=None)
string = ee.String('a')
self.assertIs(string, string.aside(mock_function))
mock_function.assert_called_once_with(string)
def test_name(self):
self.assertEqual('ComputedObject', computedobject.ComputedObject.name())
def test_cast_same(self):
var_name = 'variable name'
obj = computedobject.ComputedObject(None, None, var_name)
self.assertIs(obj, type(obj)._cast(obj))
def test_cast_different(self):
number = ee.Number(1)
result = ee.String._cast(number).getInfo()
expect = ee.String('1').getInfo()
self.assertEqual(expect, result)
def test_is_func_returning_same(self):
number = ee.Number(1)
self.assertFalse(number.is_func_returning_same(None))
self.assertFalse(number.is_func_returning_same(1))
self.assertFalse(number.is_func_returning_same(number))
number_computed_object_func = number.add(1)
self.assertTrue(number_computed_object_func)
if __name__ == '__main__':
unittest.main()