From 06484ea66499deb755835ba792e394d4cc03b77e Mon Sep 17 00:00:00 2001 From: Alexander Uralov Date: Tue, 25 Dec 2018 17:55:30 +0300 Subject: [PATCH 1/5] Tests for sms counter class --- sms_counter/tests.py | 57 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sms_counter/tests.py diff --git a/sms_counter/tests.py b/sms_counter/tests.py new file mode 100644 index 0000000..c86f783 --- /dev/null +++ b/sms_counter/tests.py @@ -0,0 +1,57 @@ +from unittest import TestCase, main + +from sms_counter import SMSCounter + + +class SMSCounterTestCase(TestCase): + """ Tests for sms counting """ + GSM_7BIT_LEN = 160 + GSM_7BIT_LEN_MULTIPART = 153 + UTF16_LEN = 70 + UTF16_LEN_MULTIPART = 67 + GSM_7BIT_CHAR_MAP = list(map(chr, SMSCounter._get_gsm_7bit_map())) + GSM_7BIT_EX_CHAR_MAP = list(map(chr, SMSCounter._get_added_gsm_7bit_ex_map())) + + def _check_gsm_7bit_sms_length(self, counter, message, message_max_length=GSM_7BIT_LEN): + length_error = 'Message length should be less than {} symbols'.format(message_max_length) + self.assertLessEqual(len(message), counter.get('per_message'), length_error) + self.assertEqual(len(message), counter.get('length')) + self.assertEqual(counter.get('messages'), 1, 'Message is not multipart') + + def test_gsm_7bit_chars(self): + message = self.GSM_7BIT_CHAR_MAP[:self.GSM_7BIT_LEN] + counter = SMSCounter.count(message) + self._check_gsm_7bit_sms_length(counter, message) + self.assertEqual(counter.get('encoding'), SMSCounter.GSM_7BIT) + + def test_gsm_7bit_ex_chars(self): + message = self.GSM_7BIT_CHAR_MAP + self.GSM_7BIT_EX_CHAR_MAP + message = message[:self.GSM_7BIT_LEN] + counter = SMSCounter.count(message) + self._check_gsm_7bit_sms_length(counter, message) + self.assertEqual(counter.get('encoding'), SMSCounter.GSM_7BIT_EX) + + def test_utf_chars(self): + utf_message = ['£', 'ф', '±'] + self.GSM_7BIT_CHAR_MAP + utf_message = utf_message[:self.UTF16_LEN] + counter = SMSCounter.count(utf_message) + self._check_gsm_7bit_sms_length(counter, utf_message, self.UTF16_LEN) + self.assertEqual(counter.get('encoding'), SMSCounter.UTF16) + + def test_multipart_sms_gsm_7bit(self): + message = self.GSM_7BIT_CHAR_MAP + self.GSM_7BIT_EX_CHAR_MAP + double_message = message[:self.GSM_7BIT_LEN_MULTIPART] * 2 + counter = SMSCounter.count(double_message) + self.assertEqual(counter.get('encoding'), SMSCounter.GSM_7BIT_EX) + self.assertEqual(counter.get('messages'), 2, 'Message must contains from 2 parts') + + def test_multipart_sms_utf(self): + utf_message = ['£', 'ф', '±'] + self.GSM_7BIT_CHAR_MAP + double_utf_message = utf_message[:self.UTF16_LEN_MULTIPART] * 2 + counter = SMSCounter.count(double_utf_message) + self.assertEqual(counter.get('encoding'), SMSCounter.UTF16) + self.assertEqual(counter.get('messages'), 2, 'Message must contains from 2 parts') + + +if __name__ == '__main__': + main() From 54f3daaa6819b3901226d9998edd5fd0ed8a6270 Mon Sep 17 00:00:00 2001 From: Alexander Uralov Date: Tue, 25 Dec 2018 18:15:00 +0300 Subject: [PATCH 2/5] The logic of sms_counter.main.SMSCounter#_detect_encoding was fixed for compatibility with origin library https://github.com/danxexe/sms-counter --- sms_counter/main.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/sms_counter/main.py b/sms_counter/main.py index 257aa85..90950cd 100644 --- a/sms_counter/main.py +++ b/sms_counter/main.py @@ -1,8 +1,8 @@ # -*- coding: utf8 -*- -''' +""" Created on Jul 10, 2016 @author: Dayo -''' +""" from math import ceil @@ -45,17 +45,15 @@ class SMSCounter(object): def _detect_encoding(cls, plaintext): rf = cls._text_to_unicode_pointcode_list(plaintext) - utf16chars = set(rf).difference(set(cls._get_gsm_7bit_map())) + non_gsm_7bit_chars = set(rf) - set(cls._get_gsm_7bit_map()) + if not non_gsm_7bit_chars: + return cls.GSM_7BIT - if len(utf16chars): - return cls.UTF16 - - exchars = set(rf).intersection(set(cls._get_added_gsm_7bit_ex_map())) - - if len(exchars): + non_gsm_7bit_ex_chars = non_gsm_7bit_chars - set(cls._get_added_gsm_7bit_ex_map()) + if not non_gsm_7bit_ex_chars: return cls.GSM_7BIT_EX - return cls.GSM_7BIT + return cls.UTF16 @classmethod def count(cls, plaintext): From 79ddd36974eff1e3b22b8c0d2be5f4754a547410 Mon Sep 17 00:00:00 2001 From: Alexander Uralov Date: Wed, 26 Dec 2018 08:11:53 +0300 Subject: [PATCH 3/5] Travis CI was enabled --- .gitignore | 1 + .travis.yaml | 5 +++++ sms_counter/tests.py => tests.py | 5 +++-- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .travis.yaml rename sms_counter/tests.py => tests.py (97%) diff --git a/.gitignore b/.gitignore index 090eda8..3c5e847 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ target/ # Virtualenv env/ +.python-version diff --git a/.travis.yaml b/.travis.yaml new file mode 100644 index 0000000..21f9f3a --- /dev/null +++ b/.travis.yaml @@ -0,0 +1,5 @@ +language: python +python: + - "3.6" +script: + - python tests.py \ No newline at end of file diff --git a/sms_counter/tests.py b/tests.py similarity index 97% rename from sms_counter/tests.py rename to tests.py index c86f783..4424414 100644 --- a/sms_counter/tests.py +++ b/tests.py @@ -1,4 +1,4 @@ -from unittest import TestCase, main +from unittest import TestCase from sms_counter import SMSCounter @@ -54,4 +54,5 @@ class SMSCounterTestCase(TestCase): if __name__ == '__main__': - main() + import unittest + unittest.main() From ea155e316281a70fd86488851686da4cbd6388c2 Mon Sep 17 00:00:00 2001 From: Alexander Uralov Date: Fri, 28 Dec 2018 07:47:32 +0300 Subject: [PATCH 4/5] Travis CI file was renamed --- .travis.yaml => .travis.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .travis.yaml => .travis.yml (100%) diff --git a/.travis.yaml b/.travis.yml similarity index 100% rename from .travis.yaml rename to .travis.yml From bd4bb584861d7db4e0c625e7789d2d736410cdb0 Mon Sep 17 00:00:00 2001 From: Alexander Uralov Date: Fri, 28 Dec 2018 07:56:40 +0300 Subject: [PATCH 5/5] travis build result was added to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5787d32..b678ac5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # sms-counter-python ---- +[![Build Status](https://travis-ci.com/uralov/sms-counter-python.svg?branch=master)](https://travis-ci.com/uralov/sms-counter-python) **sms-counter-python** is a lib that help to count characters of SMS messages.