From 2b1034a219ec07b4b0811f070e37f01853d6e262 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Sun, 25 Jun 2023 20:03:51 -0500 Subject: initial design of evaluate_expression test --- test_evaluate_expression.py | 27 +++++++++++++++++++++++++++ test_evaluate_expression.r | 1 + 2 files changed, 28 insertions(+) create mode 100644 test_evaluate_expression.py create mode 100644 test_evaluate_expression.r diff --git a/test_evaluate_expression.py b/test_evaluate_expression.py new file mode 100644 index 0000000..a6c3af9 --- /dev/null +++ b/test_evaluate_expression.py @@ -0,0 +1,27 @@ +import unittest +import dialoguer + + +class TestImportVariable(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') + + @classmethod + def tearDownClass(cls): + cls.src_fil_r.close() + + def setUp(self): + pass + + def tearDown(self): + pass + + def test_evaluate_expression(self): + res_1 = self.src_fil_r.evaluate_expression('sum', 1, 2) + self.assertEqual(res_1, 3) + + +if __name__ == '__main__': + unittest.main() diff --git a/test_evaluate_expression.r b/test_evaluate_expression.r new file mode 100644 index 0000000..d5b533b --- /dev/null +++ b/test_evaluate_expression.r @@ -0,0 +1 @@ +i <- 1 \ No newline at end of file -- cgit v1.2.3 From 2a1abc25750ea14c2c25a18f903938b9e24c2233 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Sun, 25 Jun 2023 22:03:15 -0500 Subject: Updated conversion from integer to binary. --- dialoguer/binary_conversion.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dialoguer/binary_conversion.py b/dialoguer/binary_conversion.py index a354851..9bdef6c 100644 --- a/dialoguer/binary_conversion.py +++ b/dialoguer/binary_conversion.py @@ -26,6 +26,7 @@ def bin_conv(data, data_type = None): conv_data = bin(data) conv_data = conv_data.lstrip('0b') conv_data = conv_data.zfill(8) + conv_data = ''.join(reversed(conv_data)) n = b'' for b in conv_data: m = int(b) -- cgit v1.2.3 From 30694481ec80877d227728f5dfa3866c144dfc46 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Sun, 25 Jun 2023 22:03:47 -0500 Subject: Moved comment. --- test_binary_conversion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_binary_conversion.py b/test_binary_conversion.py index 5e52e7b..5b28f4c 100644 --- a/test_binary_conversion.py +++ b/test_binary_conversion.py @@ -1,6 +1,8 @@ import unittest from dialoguer.binary_conversion import bin_conv +# some of these test currently fail because bytes are reversed. +# the binary conversions work with R's tendancy to reverse the sockets i/o # perhaps we can put reversals in this test class TestBinaryConversion(unittest.TestCase): @@ -36,8 +38,6 @@ class TestBinaryConversion(unittest.TestCase): var_i = bin_conv(bin_i, type(i)) self.assertEqual(i, var_i) - # this test currently fails because bytes are reversed. - # the binary conversions work with R's tendancy to reverse the sockets i/o def test_string_conversion(self): str_base = 'abcdefghijklmnopqrstuvwxyz!@#$%^&*()' str_base += str_base.upper() -- cgit v1.2.3 From d946a82861a4991739e7dd3a493e8a9a82da60b9 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Sun, 25 Jun 2023 22:04:14 -0500 Subject: added command handling. --- dialoguer/__init__.py | 7 +++++-- dialoguer/context_script.r | 29 +++++++++++++++++++---------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index bf1e978..7b05a5f 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -89,15 +89,18 @@ class Dialogue: return data def import_variable(self, var_name): + self.send(1) + recv_chk = self.recv(set_data_type=bool) self.send(var_name, False) val = self.recv(True) return val - def evaluate_expression(self, expr): + def evaluate_expression(self, method_name, *args): + self.send(2) pass def close(self): - self.send('!DISCONNECT') + self.send(0) self._launch.join() self.conn.close() self.conn = None diff --git a/dialoguer/context_script.r b/dialoguer/context_script.r index 9d4a4d1..1d59dd8 100644 --- a/dialoguer/context_script.r +++ b/dialoguer/context_script.r @@ -116,6 +116,16 @@ find_connection <- function() { return(con) } +import_variable <- function() { + var_name <- recv(con, FALSE, "character") + var_val <- get(var_name) + send(con, var_val, TRUE) +} + +evaluate_expression <- function () { + +} + con <- find_connection() #load target file @@ -123,16 +133,15 @@ source(TARGET_FILE) send(con, TRUE) -msg <- '' -while (msg != '!DISCONNECT') { - # there should be several handeling methods - # returning variables - # evaluating expressions - msg <- recv(con, FALSE, "character") - if (msg != '!DISCONNECT') { - val <- get(msg) - display_msg(msg, val) - send(con, val, TRUE) +cmd_int <- -1 +while (cmd_int != 0) { + cmd_int <- recv(con, FALSE, "integer") + if (cmd_int == 1){ + send(con, TRUE) + import_variable() + } else if (cmd_int == 2) { + send(con, TRUE) + evaluate_expression() } } -- cgit v1.2.3 From c0c32a7d2b9d0740521fed51dceff79b68d68f0a Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Mon, 26 Jun 2023 13:11:12 -0500 Subject: Update __init__.py rough build of evaluate_expression method --- dialoguer/__init__.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index 7b05a5f..5c4b3da 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -95,9 +95,30 @@ class Dialogue: val = self.recv(True) return val - def evaluate_expression(self, method_name, *args): + def evaluate_expression(self, method_name, *args, **kwargs): self.send(2) - pass + recv_chk = self.recv(set_data_type=bool) + #send number of arguments + self.send(len(args)) + recv_chk = self.recv(set_data_type=bool) + #send number of keyword arguments + self.send(len(kwargs) + recv_chk = self.recv(set_data_type=bool) + #send method name + self.send(method_name) + recv_chk = self.recv(set_data_type=bool) + #send arguments + for arg in args: + self.send(arg, True) + recv_chk = self.recv(set_data_type=bool) + #send keyword arguments + for kwarg in kwargs: + #k = key(kwarg) + #self.send(k) + #recv_chk = self.recv(set_data_type=bool) + #v = val(kwarg) + #self.send(v, True) + #recv_chk = self.recv(set_data_type=bool) def close(self): self.send(0) -- cgit v1.2.3 From 18a0fcd67b61c6beadd14ef1e57c3e05a35b7270 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Mon, 26 Jun 2023 17:14:41 -0500 Subject: added evaluate_expression handling with argss --- dialoguer/__init__.py | 8 ++++++-- dialoguer/context_script.r | 14 +++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index 5c4b3da..367e14b 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -102,8 +102,8 @@ class Dialogue: self.send(len(args)) recv_chk = self.recv(set_data_type=bool) #send number of keyword arguments - self.send(len(kwargs) - recv_chk = self.recv(set_data_type=bool) + # self.send(len(kwargs)) + # recv_chk = self.recv(set_data_type=bool) #send method name self.send(method_name) recv_chk = self.recv(set_data_type=bool) @@ -119,6 +119,10 @@ class Dialogue: #v = val(kwarg) #self.send(v, True) #recv_chk = self.recv(set_data_type=bool) + pass + result = self.recv(True) + return result + def close(self): self.send(0) diff --git a/dialoguer/context_script.r b/dialoguer/context_script.r index 1d59dd8..8629f2a 100644 --- a/dialoguer/context_script.r +++ b/dialoguer/context_script.r @@ -123,7 +123,19 @@ import_variable <- function() { } evaluate_expression <- function () { - + arg_count <- recv(con, FALSE, "integer") + send(con, TRUE) + method_name <- recv(con, FALSE, "character") + send(con, TRUE) + args <- list() + if (arg_count > 0) { + for (i in 1:arg_count) { + args <- c(args, recv(con, TRUE)) + send(con, TRUE) + } + } + result <- do.call(method_name, args) + send(con, result, TRUE) } con <- find_connection() -- cgit v1.2.3 From 4c129fab562b8f428aee0c45e51c6cf64035ae9a Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Mon, 26 Jun 2023 17:15:14 -0500 Subject: renamed test class --- test_evaluate_expression.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_evaluate_expression.py b/test_evaluate_expression.py index a6c3af9..171e6ed 100644 --- a/test_evaluate_expression.py +++ b/test_evaluate_expression.py @@ -2,7 +2,7 @@ import unittest import dialoguer -class TestImportVariable(unittest.TestCase): +class TestEvaluateExpression(unittest.TestCase): @classmethod def setUpClass(cls): -- cgit v1.2.3 From 577a6bc55d0422b2973648f8b55934f0c4a88e63 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Mon, 26 Jun 2023 17:25:36 -0500 Subject: added defined method test. --- test_evaluate_expression.py | 14 +++++++++----- test_evaluate_expression.r | 5 ++++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/test_evaluate_expression.py b/test_evaluate_expression.py index 171e6ed..2fc62cc 100644 --- a/test_evaluate_expression.py +++ b/test_evaluate_expression.py @@ -6,22 +6,26 @@ class TestEvaluateExpression(unittest.TestCase): @classmethod def setUpClass(cls): - cls.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') + pass @classmethod def tearDownClass(cls): - cls.src_fil_r.close() + pass def setUp(self): - pass + self.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') def tearDown(self): - pass + self.src_fil_r.close() - def test_evaluate_expression(self): + def test_built_in_method(self): res_1 = self.src_fil_r.evaluate_expression('sum', 1, 2) self.assertEqual(res_1, 3) + def test_defined_method(self): + res_1 = self.src_fil_r.evaluate_expression('test_method', 1, 2) + self.assertEqual(res_1, 3) + if __name__ == '__main__': unittest.main() diff --git a/test_evaluate_expression.r b/test_evaluate_expression.r index d5b533b..cf60a67 100644 --- a/test_evaluate_expression.r +++ b/test_evaluate_expression.r @@ -1 +1,4 @@ -i <- 1 \ No newline at end of file +test_method <- function (arg_1, arg_2) { + result <- arg_1 + arg_2 + return(result) +} \ No newline at end of file -- cgit v1.2.3 From 53b02ea030d0f8593a007b51e6a5c9c4c2e84e0c Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Tue, 27 Jun 2023 21:16:04 -0500 Subject: added float --- dialoguer/data_type_ref.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dialoguer/data_type_ref.py b/dialoguer/data_type_ref.py index 6d45ba5..0559881 100644 --- a/dialoguer/data_type_ref.py +++ b/dialoguer/data_type_ref.py @@ -3,6 +3,8 @@ data_type_dict = { 'character': str, 'int': int, 'integer': int, + 'float': float, + 'double': float, 'bool': bool, 'logical': bool, 'NoneType': type(None), -- cgit v1.2.3 From c38e93fb37510ac091e7862834ba2a0da1c0ab3b Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Tue, 27 Jun 2023 21:16:59 -0500 Subject: added evaluate_expression methods --- dialoguer/__init__.py | 17 +++++++---------- dialoguer/context_script.r | 26 +++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/dialoguer/__init__.py b/dialoguer/__init__.py index 367e14b..476cde0 100644 --- a/dialoguer/__init__.py +++ b/dialoguer/__init__.py @@ -102,8 +102,8 @@ class Dialogue: self.send(len(args)) recv_chk = self.recv(set_data_type=bool) #send number of keyword arguments - # self.send(len(kwargs)) - # recv_chk = self.recv(set_data_type=bool) + self.send(len(kwargs)) + recv_chk = self.recv(set_data_type=bool) #send method name self.send(method_name) recv_chk = self.recv(set_data_type=bool) @@ -112,14 +112,11 @@ class Dialogue: self.send(arg, True) recv_chk = self.recv(set_data_type=bool) #send keyword arguments - for kwarg in kwargs: - #k = key(kwarg) - #self.send(k) - #recv_chk = self.recv(set_data_type=bool) - #v = val(kwarg) - #self.send(v, True) - #recv_chk = self.recv(set_data_type=bool) - pass + for kw in kwargs: + self.send(kw) + recv_chk = self.recv(set_data_type=bool) + self.send(kwargs[kw], True) + recv_chk = self.recv(set_data_type=bool) result = self.recv(True) return result diff --git a/dialoguer/context_script.r b/dialoguer/context_script.r index 8629f2a..712727c 100644 --- a/dialoguer/context_script.r +++ b/dialoguer/context_script.r @@ -11,6 +11,8 @@ data_type_vect <- c( str = 'character', integer = 'integer', int = 'integer', + double = 'double', + float = 'double', logical = 'logical', bool = 'logical' ) @@ -44,6 +46,9 @@ bin_conv <- function(data, data_type_name = NA) { } else if (is.logical(data) && is.na(data_type_name)) { conv_data <- as.raw(data) conv_data <- rawToBits(conv_data) + } else if (is.double(data) && is.na(data_type_name)) { + conv_data <- as.raw(data) + conv_data <- rawToBits(conv_data) # convert from binary } else if (is.raw(data) && data_type_name == "character") { conv_data <- add_missing_bits(data) @@ -57,6 +62,10 @@ bin_conv <- function(data, data_type_name = NA) { conv_data <- add_missing_bits(data) conv_data <- packBits(conv_data, "raw") conv_data <- as.logical(conv_data) + } else if (is.raw(data) && data_type_name == "double") { + conv_data <- add_missing_bits(data) + conv_data <- packBits(conv_data, "raw") + conv_data <- as.double(conv_data) } return(conv_data) } @@ -122,9 +131,11 @@ import_variable <- function() { send(con, var_val, TRUE) } -evaluate_expression <- function () { +evaluate_expression <- function() { arg_count <- recv(con, FALSE, "integer") send(con, TRUE) + kwarg_count <- recv(con, FALSE, "integer") + send(con, TRUE) method_name <- recv(con, FALSE, "character") send(con, TRUE) args <- list() @@ -134,6 +145,19 @@ evaluate_expression <- function () { send(con, TRUE) } } + kwargs <- list() + if (kwarg_count > 0) { + keys <- c() + vals <- list() + for (i in 1:kwarg_count) { + keys <- c(keys, recv(con)) + send(con, TRUE) + vals <- c(vals, recv(con, TRUE)) + send(con, TRUE) + } + kwargs <- setNames(vals, keys) + } + args <- c(args, kwargs) result <- do.call(method_name, args) send(con, result, TRUE) } -- cgit v1.2.3 From 13808c38f81d0149b37b545180b2851c8903b4c6 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Tue, 27 Jun 2023 21:18:00 -0500 Subject: added kwargs test --- test_evaluate_expression.py | 16 ++++++++++++---- test_evaluate_expression.r | 9 +++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/test_evaluate_expression.py b/test_evaluate_expression.py index 2fc62cc..1be3b01 100644 --- a/test_evaluate_expression.py +++ b/test_evaluate_expression.py @@ -6,17 +6,17 @@ class TestEvaluateExpression(unittest.TestCase): @classmethod def setUpClass(cls): - pass + cls.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') @classmethod def tearDownClass(cls): - pass + cls.src_fil_r.close() def setUp(self): - self.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') + pass def tearDown(self): - self.src_fil_r.close() + pass def test_built_in_method(self): res_1 = self.src_fil_r.evaluate_expression('sum', 1, 2) @@ -26,6 +26,14 @@ class TestEvaluateExpression(unittest.TestCase): res_1 = self.src_fil_r.evaluate_expression('test_method', 1, 2) self.assertEqual(res_1, 3) + def test_kwargs(self): + kwargs = { + 'arg_1': 2, + 'arg_2': 3 + } + res_1 = self.src_fil_r.evaluate_expression('test_kwargs', **kwargs) + self.assertEqual(res_1, 6) + if __name__ == '__main__': unittest.main() diff --git a/test_evaluate_expression.r b/test_evaluate_expression.r index cf60a67..256abea 100644 --- a/test_evaluate_expression.r +++ b/test_evaluate_expression.r @@ -1,4 +1,9 @@ -test_method <- function (arg_1, arg_2) { +test_method <- function(arg_1, arg_2) { result <- arg_1 + arg_2 return(result) -} \ No newline at end of file +} + +test_kwargs <- function(arg_1 = 1, arg_2 = 1) { + result <- arg_1 * arg_2 + return(result) +} -- cgit v1.2.3 From 6befebe3030105bd88f22970a369178a2b7212e1 Mon Sep 17 00:00:00 2001 From: TinWoodman92 Date: Sat, 1 Jul 2023 16:33:14 -0500 Subject: added args and kwargs test. --- test_evaluate_expression.py | 26 ++++++++++++++++++-------- test_evaluate_expression.r | 7 +++++++ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/test_evaluate_expression.py b/test_evaluate_expression.py index 1be3b01..157ad96 100644 --- a/test_evaluate_expression.py +++ b/test_evaluate_expression.py @@ -4,19 +4,19 @@ import dialoguer class TestEvaluateExpression(unittest.TestCase): - @classmethod - def setUpClass(cls): - cls.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') + # @classmethod + # def setUpClass(cls): + # cls.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') - @classmethod - def tearDownClass(cls): - cls.src_fil_r.close() + # @classmethod + # def tearDownClass(cls): + # cls.src_fil_r.close() def setUp(self): - pass + self.src_fil_r = dialoguer.Dialogue('test_evaluate_expression.r') def tearDown(self): - pass + self.src_fil_r.close() def test_built_in_method(self): res_1 = self.src_fil_r.evaluate_expression('sum', 1, 2) @@ -34,6 +34,16 @@ class TestEvaluateExpression(unittest.TestCase): res_1 = self.src_fil_r.evaluate_expression('test_kwargs', **kwargs) self.assertEqual(res_1, 6) + def test_args_and_kwargs(self): + args = [2, 3] + kwargs = { + 'kwarg_1': 2, + 'kwarg_2': 3 + } + res_1 = self.src_fil_r.evaluate_expression('test_args_and_kwargs', *args, **kwargs) + res_ctrl = args[0] * args[1] * kwargs['kwarg_1'] * kwargs['kwarg_2'] + self.assertEqual(res_ctrl, res_1) + if __name__ == '__main__': unittest.main() diff --git a/test_evaluate_expression.r b/test_evaluate_expression.r index 256abea..1f918cc 100644 --- a/test_evaluate_expression.r +++ b/test_evaluate_expression.r @@ -7,3 +7,10 @@ test_kwargs <- function(arg_1 = 1, arg_2 = 1) { result <- arg_1 * arg_2 return(result) } + +test_args_and_kwargs <- function(arg_1, arg_2, kwarg_1 = 1., kwarg_2 = 3) { + result <- arg_1 * arg_2 + result <- result * kwarg_1 + result <- result * kwarg_2 + return(result) +} -- cgit v1.2.3