PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/rapidandroid/org.rapidandroid/unittests/org/rapidandroid/tests/MessageCorpusTests.java

http://github.com/dimagi/rapidandroid
Java | 310 lines | 195 code | 43 blank | 72 comment | 12 complexity | 10b6cd894b5330520a28a5d95aef3e9d MD5 | raw file
Possible License(s): Apache-2.0
  1. /*
  2. * Copyright (C) 2009 Dimagi Inc., UNICEF
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. *
  16. */
  17. package org.rapidandroid.tests;
  18. import java.io.BufferedReader;
  19. import java.io.IOException;
  20. import java.io.InputStream;
  21. import java.io.StringReader;
  22. import java.text.ParseException;
  23. import java.util.Date;
  24. import java.util.StringTokenizer;
  25. import java.util.Vector;
  26. import org.rapidandroid.ModelBootstrap;
  27. import org.rapidandroid.content.translation.MessageTranslator;
  28. import org.rapidandroid.content.translation.ModelTranslator;
  29. import org.rapidandroid.content.translation.ParsedDataTranslator;
  30. import org.rapidandroid.data.RapidSmsDBConstants;
  31. import org.rapidandroid.data.SmsDbHelper;
  32. import org.rapidsms.java.core.model.Form;
  33. import org.rapidsms.java.core.model.Message;
  34. import org.rapidsms.java.core.model.Monitor;
  35. import org.rapidsms.java.core.parser.IParseResult;
  36. import org.rapidsms.java.core.parser.service.ParsingService;
  37. import android.content.ContentValues;
  38. import android.content.Context;
  39. import android.content.Intent;
  40. import android.database.Cursor;
  41. import android.net.Uri;
  42. import android.telephony.gsm.SmsManager;
  43. import android.test.AndroidTestCase;
  44. /**
  45. * @author Daniel Myung dmyung@dimagi.com
  46. * @created Feb 6, 2009 Summary:
  47. */
  48. public class MessageCorpusTests extends AndroidTestCase {
  49. private String[] prefixes = null;
  50. private Form[] forms = null;
  51. private Context mContext = null;
  52. private SmsDbHelper mHelper;
  53. private void initLists() {
  54. forms = ModelTranslator.getAllForms();
  55. prefixes = new String[forms.length];
  56. for (int i = 0; i < forms.length; i++) {
  57. prefixes[i] = forms[i].getPrefix();
  58. getContext().getContentResolver().delete(Uri.parse(RapidSmsDBConstants.FormData.CONTENT_URI_PREFIX
  59. + forms[i].getFormId()), null, null);
  60. }
  61. }
  62. /*
  63. * (non-Javadoc)
  64. *
  65. * @see android.test.AndroidTestCase#setUp()
  66. */
  67. @Override
  68. protected void setUp() throws Exception {
  69. // TODO Auto-generated method stub
  70. super.setUp();
  71. ModelBootstrap.InitApplicationDatabase(getContext());
  72. mHelper = new SmsDbHelper(getContext());
  73. ModelTranslator.setDbHelper(mHelper, getContext());
  74. initLists();
  75. getContext().getContentResolver().delete(RapidSmsDBConstants.Message.CONTENT_URI, null, null);
  76. }
  77. /*
  78. * (non-Javadoc)
  79. *
  80. * @see android.test.AndroidTestCase#tearDown()
  81. */
  82. @Override
  83. protected void tearDown() throws Exception {
  84. // TODO Auto-generated method stub
  85. super.tearDown();
  86. }
  87. @SuppressWarnings("finally")
  88. private Vector<String[]> readRawMessages() {
  89. String rawMessageText = loadAssetFile("testdata/rawdata.csv");
  90. return readCsv(rawMessageText);
  91. }
  92. /**
  93. * @param rawMessageText
  94. * @return
  95. */
  96. private Vector<String[]> readCsv(String rawMessageText) {
  97. StringReader sr = new StringReader(rawMessageText);
  98. BufferedReader bufRdr = new BufferedReader(sr);
  99. String line = null;
  100. int row = 0;
  101. int col = 0;
  102. Vector<String[]> lines = new Vector<String[]>();
  103. // read each line of text file
  104. try {
  105. while ((line = bufRdr.readLine()) != null) {
  106. StringTokenizer st = new StringTokenizer(line, ",");
  107. int tokCount = st.countTokens();
  108. String[] tokenizedLine = new String[tokCount];
  109. int toki = 0;
  110. while (st.hasMoreTokens()) {
  111. tokenizedLine[toki] = st.nextToken();
  112. toki++;
  113. }
  114. lines.add(tokenizedLine);
  115. }
  116. } catch (IOException e) {
  117. // TODO Auto-generated catch block
  118. e.printStackTrace();
  119. } finally {
  120. try {
  121. sr.close();
  122. bufRdr.close();
  123. } catch (IOException e) {
  124. // TODO Auto-generated catch block
  125. e.printStackTrace();
  126. }
  127. }
  128. return lines;
  129. }
  130. private Vector<String[]> readRawAnswers() {
  131. String rawMessageText = loadAssetFile("testdata/answers.csv");
  132. return readCsv(rawMessageText);
  133. }
  134. private Form determineForm(String message) {
  135. int len = prefixes.length;
  136. for (int i = 0; i < len; i++) {
  137. String prefix = prefixes[i];
  138. if (message.toLowerCase().trim().startsWith(prefix + " ")) {
  139. return forms[i];
  140. }
  141. }
  142. return null;
  143. }
  144. /**
  145. * Retains the dates in a given message
  146. *
  147. * @param phone
  148. * @param date
  149. * @param text
  150. */
  151. private void injectMessageDirect(String phone, Date date, String text) {
  152. Uri writeMessageUri = RapidSmsDBConstants.Message.CONTENT_URI;
  153. Monitor monitor = MessageTranslator.GetMonitorAndInsertIfNew(getContext(), phone);
  154. ContentValues messageValues = new ContentValues();
  155. messageValues.put(RapidSmsDBConstants.Message.MESSAGE, text);
  156. messageValues.put(RapidSmsDBConstants.Message.MONITOR, monitor.getID());
  157. messageValues.put(RapidSmsDBConstants.Message.TIME, Message.SQLDateFormatter.format(date));
  158. messageValues.put(RapidSmsDBConstants.Message.RECEIVE_TIME, Message.SQLDateFormatter.format(date));
  159. messageValues.put(RapidSmsDBConstants.Message.IS_OUTGOING, false);
  160. Uri msgUri = null;
  161. Form mForm = determineForm(text);
  162. msgUri = getContext().getContentResolver().insert(writeMessageUri, messageValues);
  163. Vector<IParseResult> results = ParsingService.ParseMessage(mForm, text);
  164. ParsedDataTranslator.InsertFormData(getContext(), mForm, Integer.valueOf(msgUri.getPathSegments().get(1))
  165. .intValue(), results);
  166. }
  167. private String loadAssetFile(String filename) {
  168. try {
  169. InputStream is = getContext().getAssets().open(filename);
  170. int size = is.available();
  171. // Read the entire asset into a local byte buffer.
  172. byte[] buffer = new byte[size];
  173. is.read(buffer);
  174. is.close();
  175. // Convert the buffer into a Java string.
  176. String text = new String(buffer);
  177. return text;
  178. } catch (IOException e) {
  179. // Should never happen!
  180. throw new RuntimeException(e);
  181. }
  182. }
  183. private void sendMessageViaSMS(Context context, String mesg) {
  184. SmsManager smgr = SmsManager.getDefault();
  185. Intent intent = new Intent();
  186. smgr.sendTextMessage("5554", null, mesg, null, null);
  187. }
  188. public void testInsertDirect() {
  189. Vector<String[]> rawMessages = readRawMessages();
  190. int len = rawMessages.size();
  191. for (int i = 0; i < len; i++) {
  192. String[] line = rawMessages.get(i);
  193. assertEquals(3, line.length);
  194. String datestr = line[0];
  195. Date dateval = new Date();
  196. try {
  197. dateval = Message.SQLDateFormatter.parse(datestr);
  198. } catch (ParseException e) {
  199. // TODO Auto-generated catch block
  200. e.printStackTrace();
  201. assertTrue(false);
  202. }
  203. String sender = line[1];
  204. String text = line[2];
  205. injectMessageDirect(sender, dateval, text);
  206. }
  207. Cursor cr = getContext().getContentResolver().query(RapidSmsDBConstants.Message.CONTENT_URI, null, null, null,
  208. null);
  209. assertEquals(cr.getCount(), rawMessages.size());
  210. }
  211. // public void testInsertViaSendSMS() {
  212. // Vector<String[]> rawMessages = readRawMessages();
  213. // int len = rawMessages.size();
  214. //
  215. // for(int i = 0; i < len; i++) {
  216. // String[] line = rawMessages.get(i);
  217. // assertEquals(3,line.length);
  218. // String text = line[2];
  219. //
  220. // sendMessageViaSMS(getContext(),text);
  221. // }
  222. //
  223. // Cursor cr =
  224. // getContext().getContentResolver().query(RapidSmsDBConstants.Message.CONTENT_URI,
  225. // null,null,null,null);
  226. // assertEquals(cr.getCount(),rawMessages.size());
  227. // }
  228. public void testInsertVerifyCounts() {
  229. testInsertDirect();
  230. Vector<String[]> rawMessages = readRawMessages();
  231. Vector<String[]> rawAnswers = readRawAnswers();
  232. Form mForm = null;
  233. assertEquals(rawMessages.size(), rawAnswers.size());
  234. int len = rawMessages.size();
  235. for (int i = 0; i < len; i++) {
  236. String[] line = rawMessages.get(i);
  237. // String[] answers = rawAnswers.get(i);
  238. String text = line[2];
  239. mForm = determineForm(text);
  240. if (i == 0) {
  241. Cursor cr = getContext().getContentResolver()
  242. .query(
  243. Uri.parse(RapidSmsDBConstants.FormData.CONTENT_URI_PREFIX
  244. + mForm.getFormId()), null, null, null, null);
  245. assertEquals(cr.getCount(), len);
  246. cr.close();
  247. // sorry, ridiculous, i know
  248. break;
  249. }
  250. }
  251. // now, let's parse the data itself
  252. Cursor answercursor = getContext().getContentResolver()
  253. .query(
  254. Uri.parse(RapidSmsDBConstants.FormData.CONTENT_URI_PREFIX
  255. + mForm.getFormId()), null, null, null, null);
  256. answercursor.moveToFirst();
  257. for (int i = 0; i < len; i++) {
  258. String[] answers = rawAnswers.get((len - 1) - i);
  259. // assertEquals(answercursor.getColumnCount(), 6);
  260. // this is cuz the answer data has a leading column
  261. for (int j = 1; j < answers.length; j++) {
  262. assertEquals(answers[j].trim().toLowerCase(), answercursor.getString(j + 1));
  263. }
  264. answercursor.moveToNext();
  265. }
  266. }
  267. }