Browse Source

updated sources and readme

Jose Ortiz 9 years ago
parent
commit
883681d285
17 changed files with 3261 additions and 915 deletions
  1. BIN
      Guia para el instructor.docx
  2. 2
    339
      README.md
  3. 1773
    0
      Testing.html
  4. 703
    0
      Testing.md
  5. 0
    1
      Testing.pro
  6. 7
    0
      UnitTests/UnitTests.pro
  7. 130
    0
      UnitTests/main.cpp
  8. 265
    42
      functions.cpp
  9. 4
    292
      functions.h
  10. 0
    1
      images.qrc
  11. BIN
      imagesTesting.zip
  12. 48
    1
      main.cpp
  13. 278
    57
      mainwindow.cpp
  14. 45
    152
      mainwindow.h
  15. 4
    3
      mainwindow.ui
  16. 1
    1
      secondwindow.cpp
  17. 1
    26
      secondwindow.h

BIN
Guia para el instructor.docx View File


+ 2
- 339
README.md
File diff suppressed because it is too large
View File


+ 1773
- 0
Testing.html
File diff suppressed because it is too large
View File


+ 703
- 0
Testing.md View File

1
+[English](#markdown-header-testing-and-unit-testing) | [Español](#markdown-header-pruebas-y-pruebas-unitarias)
2
+
3
+#Pruebas y pruebas unitarias
4
+
5
+![main1.png](images/main1.png)
6
+![main2.png](images/main2.png)
7
+![main3.png](images/main3.png)
8
+
9
+
10
+Como habrás aprendido en experiencias de laboratorio anteriores, lograr que un programa compile es solo una pequeña parte de programar. El compilador se encargará de decirte si hubo errores de sintaxis, pero no podrá detectar errores en la lógica del programa. Es muy importante el probar las funciones del programa para validar que producen los resultados correctos y esperados.
11
+
12
+Una manera de hacer estas pruebas es “a mano”, esto es, corriendo el programa múltiples veces, ingresando valores representativos (por medio del teclado) y visualmente verificando que el programa devuelve los valores esperados. Una forma más conveniente es implementar funciones dentro del programa cuyo propósito es verificar que otras funciones produzcan resultados correctos. En esta experiencia de laboratorio practicarás ambos métodos de verificación.
13
+
14
+##Objetivos:
15
+
16
+1. Validar el funcionamiento de varias funciones haciendo pruebas "a mano".
17
+2. Crear pruebas unitarias para validar funciones, utilizando la función `assert` 
18
+
19
+
20
+
21
+##Pre-Lab:
22
+
23
+Antes de llegar al laboratorio debes:
24
+
25
+1. Haber repasado los conceptos básicos relacionados a pruebas y pruebas unitarias.
26
+
27
+2. Haber repasado el uso de la función `assert` para hacer pruebas.
28
+
29
+3. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
30
+
31
+4. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
32
+
33
+---
34
+
35
+---
36
+
37
+##Haciendo pruebas a una función. 
38
+
39
+Cuando probamos la validez de una función debemos probar casos que activen los diversos resultados de la función. 
40
+
41
+---
42
+
43
+**Ejemplo 1:** si fueras a validar una función `esPar(unsigned int n)` que determina si un entero positivo *n* es par, deberías hacer pruebas a la función tanto con números pares como números impares. Un conjunto adecuado de pruebas para dicha función podría ser:
44
+
45
+
46
+|   Prueba   | Resultado esperado |
47
+|------------|--------------------|
48
+| `esPar(8)` | true               |
49
+| `esPar(7)` | false                   |
50
+
51
+---
52
+
53
+**Ejemplo 2:** Digamos que un amigo ha creado una función `unsigned int rangoEdad(unsigned int edad)` que se supone que devuelva 0 si la edad está entre 0 y 5 (inclusive), 1 si la edad está entre 6 y 18 inclusive, y 2 si la edad es mayor de 18. Una fuente común de errores en funciones como esta son los valores próximos a los límites de cada rango, por ejemplo, el número 5 se presta para error si el programador  no usó una comparación correcta. Un conjunto adecuado  de pruebas para la función `rangoEdad` sería:
54
+
55
+|      Prueba     | Resultado esperado |
56
+|-----------------|--------------------|
57
+| `rangoEdad(5)`  |                  0 |
58
+| `rangoEdad(2)`  |                  0 |
59
+| `rangoEdad(6)`  |                  1 |
60
+| `rangoEdad(18)` |                  1 |
61
+| `rangoEdad(17)` |                  1 |
62
+| `rangoEdad(19)` |                  2 |
63
+| `rangoEdad(25)` |                  2 |
64
+
65
+---
66
+
67
+###La función `assert`
68
+
69
+
70
+La función `assert(bool expression)` se puede utilizar como herramienta rudimentaria para validar de funciones. `assert` tiene un funcionamiento muy sencillo y poderoso.  Si la expresión que colocamos entre los paréntesis de `assert` es *cierta* la función permite que el programa continúe con la próxima instrucción. De lo contrario, si la expresión que colocamos entre los paréntesis es *falsa*, la función `assert` hace que el programa termine e imprime un mensaje al terminal que informa al usuario sobre la instrucción de `assert` que falló. 
71
+
72
+Por ejemplo, el siguiente programa correrá de principio a fin sin problemas pues todos las expresiones incluidas en los paréntesis de los asserts evalúan a *true*.
73
+
74
+---
75
+
76
+```cpp
77
+#include <iostream>
78
+#include <cassert>
79
+using namespace std;
80
+
81
+int main() {
82
+   int i = 10, j = 15;
83
+   assert(i == 10);
84
+   assert(j == i + 5);
85
+   assert(j != i);
86
+   assert( (j < i) == false);
87
+   cout << "Eso es todo, amigos!" << endl;
88
+   return 0;
89
+}
90
+
91
+```
92
+
93
+**Figura 1.** Ejemplo de programa que pasa todas las pruebas de `assert`.
94
+
95
+---
96
+
97
+El siguiente programa no correrá hasta el final pues el segundo `assert` (`assert(j == i);`)  contiene una expresión  (`j==i`) que evalúa a *false*.
98
+
99
+---
100
+
101
+```cpp
102
+
103
+#include <iostream>
104
+#include <cassert>
105
+using namespace std;
106
+
107
+int main() {
108
+   int i = 10, j = 15;
109
+   assert(i == 10);
110
+   assert(j == i);
111
+   assert(j != i);
112
+   assert( (j < i) == false);
113
+   cout << "Eso es todo, amigos!" << endl;
114
+   return 0;
115
+}
116
+
117
+```
118
+
119
+**Figura 2.** Ejemplo de programa que no "pasa" una prueba de `assert`.
120
+
121
+---
122
+
123
+Al correr el pasado programa, en lugar de obtener la frase `”Eso es todo amigos!”` en el terminal, obtendremos un mensaje como el siguiente:
124
+
125
+`Assertion failed: (j == i), function main, file ../programa01/main.cpp, line 8.`
126
+
127
+El programa no ejecuta más instrucciones después de la línea 8.
128
+
129
+####¿Cómo usar assert para validar funciones?
130
+
131
+Digamos que deseas automatizar la validación de la función `rangoEdad`. Un forma de hacerlo es crear una función que llame a la función `rangoEdad` con diversos argumentos y verifique que lo devuelto concuerde con el resultado esperado. Si incluimos cada comparación entre lo devuelto por `rangoEdad` y el resultado esperado dentro de un `assert`, obtenemos una función que se ejecuta de principio a fin solo si todas las invocaciones devolvieron el resultado esperado.
132
+
133
+---
134
+
135
+```cpp
136
+void test_rangoEdad() {
137
+   assert(rangoEdad(5) == 0);
138
+   assert(rangoEdad(2) == 0);
139
+   assert(rangoEdad(6) == 1);
140
+   assert(rangoEdad(18) == 1);
141
+   assert(rangoEdad(17) == 1);
142
+   assert(rangoEdad(19) == 2);
143
+   assert(rangoEdad(25) == 2);
144
+   cout << "rangoEdad passed all tests!!!" << endl;
145
+}
146
+```
147
+
148
+**Figura 3.** Ejemplo de una función para pruebas usando `assert`.
149
+
150
+
151
+---
152
+
153
+---
154
+
155
+
156
+##Sesión de laboratorio:
157
+
158
+###Ejercicio 1: Diseñar pruebas "a mano"
159
+
160
+En este ejercicio practicarás cómo diseñar pruebas para validar funciones, utilizando solamente la descripción de la función y la interfaz que se usa para interactuar con la función. 
161
+
162
+El ejercicio **NO requiere programación**, solo requiere que entiendas la descripción de la función, y tu habilidad para diseñar pruebas. Este ejercicio y el Ejercicio 2 son una adaptación del ejercicio en [1].
163
+
164
+**Ejemplo 3.** Supón que una amiga te provee un programa. Ella asegura que el programa resuelve el siguiente problema: 
165
+
166
+`"dados tres enteros, despliega el valor máximo".` 
167
+
168
+Supón que el programa tienen una interfaz como la siguiente:
169
+
170
+---
171
+
172
+![figure4.png](images/figure4.png)
173
+
174
+**Figura 4** - Interfaz de un programa para hallar el valor máximo entre tres enteros.
175
+
176
+---
177
+
178
+Podrías determinar si el programa provee resultados válidos **sin analizar el código fuente**. Por ejemplo, podrías intentar los siguientes casos:
179
+
180
+* a = 4, b = 2, c = 1; resultado esperado: 4
181
+* a = 3, b = 6, c = 2; resultado esperado: 6
182
+* a = 1, b = 10, c = 100; resultado esperado: 100
183
+
184
+Si alguno de estos tres casos no da el resultado esperado, el programa de tu amiga no funciona. Por otro lado, si los tres casos funcionan, entonces el programa tiene una probabilidad alta de estar correcto.
185
+
186
+####Funciones para validar
187
+
188
+En este ejercicio estarás diseñando pruebas que validen varias versiones de las funciones que se describen abajo. Cada una de las funciones tiene cuatro versiones, "Alpha", "Beta", "Gamma" y "Delta".
189
+
190
+
191
+* **3 Sorts:** una función que recibe tres "strings" y los ordena en orden lexicográfico (alfabético). Por ejemplo, dados `jirafa`, `zorra`, y `coqui`, los ordena como: `coqui`, `jirafa`, y `zorra`.  Para simplificar el ejercicio, solo usaremos "strings" con letras minúsculas. La Figura 5 muestra la interfaz de esta función. Nota que hay un menú para seleccionar la versión implementada.
192
+
193
+  ---
194
+
195
+
196
+    ![figure5.png](images/figure5.png)
197
+
198
+    **Figura 5** - Interfaz de la función `3 Sorts`.
199
+
200
+  ---
201
+
202
+
203
+
204
+* **Dice:** cuando el usuario marca el botón `Roll them!`, el programa genera dos números aleatorios entre 1 y 6. El programa informa la suma de los números aleatorios. 
205
+
206
+  ---
207
+
208
+    ![figure6.png](images/figure6.png)
209
+
210
+    **Figura 6** - Interfaz de la función `Dice`.
211
+
212
+  ---
213
+
214
+* **Rock, Paper, Scissors:** cada uno de los jugadores entra su jugada y el programa informa quién ganó. La Figura 7 muestra las opciones en las que un objeto le gana a otro. La interfaz del juego se muestra en la  Figura 8.
215
+
216
+  ---
217
+
218
+    ![figure7.jpg](images/figure7.jpg)
219
+
220
+    **Figura 7** - Formas de ganar en el juego "Piedra, papel y tijera".
221
+
222
+  ---
223
+
224
+    ![figure8.png](images/figure8.png)
225
+
226
+    **Figura 8** - Interfaz de la función `Rock, Paper, Scissors`.
227
+
228
+  ---
229
+
230
+
231
+* **Zulu time:** Dada una hora en tiempo Zulu (Hora en el Meridiano de Greenwich) y la zona militar en la que el usuario desea saber la hora, el programa muestra la hora en esa zona. El formato para el dato de entrada es en formato de 23 horas `####`, por ejemplo `2212` sería las 10:12 pm. La lista de zonas militares válidas la puedes encontrar en  http://en.wikipedia.org/wiki/List_of_military_time_zones. Lo que sigue son ejemplos de cómo deben ser los resultados del programa:
232
+
233
+  * Dada hora Zulu 1230 y zona A (UTC+1), el resultado debe ser 1330.
234
+  * Dada hora Zulu 1230 y zona N (UTC-1), el resultado debe ser 1130.
235
+  * Puerto Rico está en la zona militar Q (UTC-4), por lo tanto, cuando es 1800 en hora Zulu, son las 1400 en Puerto Rico.
236
+  
237
+  ---
238
+
239
+    ![figure9.png](images/figure9.png)
240
+
241
+    **Figura 9** - Interfaz de la función `Zulu time`.
242
+
243
+  ---
244
+
245
+####Instrucciones
246
+
247
+1. Para cada una de las funciones descritas arriba, escribe en tu libreta las pruebas que harás para determinar la validez de cada implementación (Alpha, Beta, Gamma y Delta). Para cada función, piensa en los errores lógicos que el programador pudo haber cometido y escribe pruebas que determinen si se cometió ese error. Para cada prueba, escribe los valores que utilizarás y el resultado que esperas obtener.
248
+
249
+  Por ejemplo, puedes organizar tus respuestas en una tabla como la que sigue:
250
+
251
+  ---
252
+
253
+
254
+  | 3 Sorts |                           |                           |           |            |            |
255
+  |---------|---------------------------|---------------------------|-----------|------------|------------|
256
+  | Num     | Prueba                    | Result Alpha              | Res. Beta | Res. Gamma | Res. Delta |
257
+  | 1       | "alce", "coyote", "zorro" | "alce", "coyote", "zorro" | ....      | ....       |            |
258
+  | 2       | "alce", "zorro", "coyote" | "zorro", "alce", "coyote" | ....      | ....       |            |
259
+  | ....    | ....                      | ....                      | ....      | ....       | ....       |
260
+
261
+  **Figura 10** - Tabla para organizar los resultados de las pruebas.
262
+
263
+  ---
264
+
265
+  Puedes ver ejemplos de cómo organizar tus resultados [aquí](http://i.imgur.com/ggDZ3TQ.png) y [aquí](http://i.imgur.com/rpApVqm.png). 
266
+
267
+
268
+
269
+###Ejercicio 2: Hacer pruebas "a mano"
270
+
271
+El proyecto `testing` implementa varias versiones de cada una de las cuatro funciones simples que se decribieron en el Ejercicio 1. Algunas o todas las implementaciones pueden estar incorrectas. Tu tarea es, usando las pruebas que diseñaste en el Ejercicio 1, probar las versiones de cada función para  determinar cuáles de ellas, si alguna, están  implementadas correctamente.
272
+
273
+Este ejercicio **NO requiere programación**, debes hacer las pruebas **sin mirar el código.**
274
+
275
+####Instrucciones
276
+
277
+1. Carga a Qt el proyecto `Testing`  haciendo doble "click" en el archivo `Testing.pro` en el directorio `Documents/eip/Testing` de tu computadora. También puedes ir a `http://bitbucket.org/eip-uprrp/testing` para descargar la carpeta `Testing` a tu computadora.
278
+
279
+2. Configura el proyecto y corre el programa. Verás una pantalla similar a la siguiente:
280
+  
281
+  ---
282
+
283
+    ![figure11.png](images/figure11.png)
284
+
285
+    **Figura 11** - Ventana para seleccionar la función que se va a probar.
286
+
287
+  ---
288
+
289
+3. Selecciona el botón de `3 Sorts` y obtendrás la interfaz de la Figura 5.
290
+
291
+4. La "Version Alpha" en la caja indica que estás corriendo la primera versión del algoritmo `3 Sorts`. Usa las pruebas que escribiste en el Ejercicio 1 para validar la "Version Alpha". Luego, haz lo mismo para las versiones Beta, Gamma y Delta. Escribe cuáles son las versiones correctas (si alguna) de la función y porqué. Recuerda que, para cada función, algunas o todas las implementaciones pueden estar incorrectas. Además, especifica cuáles pruebas te permitieron determinar  las  versiones que son incorrectas.
292
+
293
+
294
+
295
+###Ejercicio 3: Usar `assert` para realizar pruebas unitarias
296
+
297
+Hacer pruebas "a mano" cada vez que corres un programa es una tarea que resulta "cansona" bien rápido. En los ejercicios anteriores lo hiciste para unas pocas funciones simples. !Imagínate hacer lo mismo para un programa complejo completo como un buscador o un procesador de palabras!
298
+
299
+Las *pruebas unitarias* ayudan a los programadores a validar códigos y simplificar el proceso de depuración ("debugging") a la vez que evitan la tarea tediosa de hacer pruebas a mano en cada ejecución.
300
+
301
+####Instrucciones:
302
+
303
+1. En el menú de QT, ve a `Build` y selecciona `Clean Project "Testing"`.
304
+
305
+2. Carga a Qt el proyecto `UnitTests`  haciendo doble "click" en el archivo `UnitTests.pro` en el directorio `Documents/eip/Testing` de tu computadora. También puedes ir a `http://bitbucket.org/eip-uprrp/testing` para descargar la carpeta `Testing` a tu computadora.
306
+
307
+3. El proyecto solo contiene el archivo de código fuente `main.cpp`. Este archivo contiene cuatro funciones: `fact`, `isALetter`, `isValidTime`, y `gcd`, cuyos resultados son solo parcialmente correctos. 
308
+
309
+  Estudia la descripción de  cada una de las funciones que aparece como comentarios antes el código de la función para saber la tarea que se espera haga la función.
310
+
311
+  Tu tarea es escribir pruebas unitarias para cada una de las funciones para identificar los resultados erróneos. ** No necesitas reescribir las funciones para corregirlas. **
312
+
313
+  Para la función `fact` se provee la función  `test_fact()`  como función de prueba unitaria. Si invocas esta función desde `main`, compilas y corres el programa debes obtener un mensaje como el siguiente:
314
+
315
+    `Assertion failed: (fact(2) == 2), function test_fact, file ../UnitTests/ main.cpp, line 69.`
316
+
317
+  Esto es suficiente para saber que la función `fact` NO está correctamente implementada. 
318
+
319
+4. Nota que, al fallar la prueba anterior, el programa no continuó su ejecución. Para poder probar el código que escribirás, comenta la invocación de `test_fact()` en `main`.
320
+
321
+5. Escribe una prueba unitaria llamada `test_isALetter` para la función `isALetter`. En la prueba unitaria escribe varias  afirmaciones ("asserts") para probar algunos datos de entrada y sus valores esperados (mira la función `test_fact` para que te inspires). Invoca `test_isALetter` desde `main` y ejecuta tu programa. Si la función `isALetter` pasa las pruebas que escribiste, continúa escribiendo "asserts" y ejecutando tu programa hasta que alguno de los `asserts` falle. 
322
+
323
+6. Comenta la invocación de `test_isALetter` en `main` para que puedas continuar con las otras funciones.
324
+
325
+7. Repite los pasos 5 y 6 paras las otras dos funciones, `isValidTime` y `gcd`.  Recuerda que debes llamar a cada una de las funciones de prueba unitaria desde `main` para que corran. 
326
+
327
+---
328
+
329
+---
330
+
331
+##Entregas
332
+
333
+1. Utiliza "Entrega 1" en Moodle para entregar la tabla con las pruebas que diseñaste en el Ejercicio 1 y que completaste en el Ejercicio 2 con los resultados de las pruebas de las funciones.
334
+
335
+2. Utiliza "Entrega 2" en Moodle para entregar el archivo `main.cpp` que contiene las funciones `test_isALetter`, `test_isValidTime`, `test_gcd` y sus invocaciones. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
336
+
337
+---
338
+
339
+---
340
+
341
+## Referencias
342
+
343
+[1] http://nifty.stanford.edu/2005/TestMe/
344
+
345
+---
346
+
347
+---
348
+
349
+---
350
+
351
+
352
+
353
+[English](#markdown-header-testing-and-unit-testing) | [Español](#markdown-header-pruebas-y-pruebas-unitarias)
354
+
355
+#Testing and Unit Testing
356
+
357
+![](http://demo05.cloudimage.io/s/resize/215/i.imgur.com/D0laI5r.png)
358
+![](http://demo05.cloudimage.io/s/resize/215/i.imgur.com/ggDZ3TQ.png)
359
+![](http://demo05.cloudimage.io/s/resize/215/i.imgur.com/V6xFo00.png)
360
+
361
+
362
+
363
+As you have learned in previous labs, getting a program to compile is only a minor part of programming. The compiler will tell you if there are syntactical errors, but it isn't capable of detecting logical problems in your program. It's very important to test the program's functions to validate that they produce correct results.
364
+
365
+These tests can be performed by hand, this is, running the program multiple times, providing representative inputs and visually checking that the program outputs correct results. A more convenient way is to implement functions in the program whose sole purpose is to validate that other functions are working correctly. In this lab you will be practicing both testing methods.
366
+
367
+
368
+##Objectives:
369
+
370
+1. Design tests to validate several programs “by-hand”, then use these tests to determine if the program works as expected. 
371
+2. Create unit tests to validate functions, using the `assert` function.
372
+
373
+
374
+##Pre-Lab:
375
+
376
+Before you get to the laboratory you should have:
377
+
378
+1. Reviewed the basic concepts related to testing and unit tests.
379
+
380
+2. Reviewed how to use the `assert` function to validate another function.
381
+
382
+3. Studied the concepts and instructions for this laboratory session.
383
+
384
+4. Taken the Pre-Lab quiz available in Moodle.
385
+
386
+---
387
+
388
+---
389
+
390
+## Testing a function
391
+
392
+When we test a function's validity we should test cases that activate the various results the function could return.
393
+
394
+---
395
+
396
+**Example 1:** if you were to validate the function `isEven(unsigned int n)` that determines if a positive integer *n* is even, you should test the function using even and odd numbers. A set of tests for that function could be:
397
+
398
+
399
+|     Test     | Expected Result |
400
+|--------------|-----------------|
401
+| `isEven(8)`  | true            |
402
+| `isEven(7)`  | false           |
403
+
404
+---
405
+
406
+**Example 2:** Suppose that a friend has created a function `unsigned int ageRange(unsigned int age)` that is supposed to return 0 if the age is between 0 and 5 (inclusive), 1 if the age is between 6 and 18 inclusive, and 2 if the age is above 18. A common source of errors in functions like this one are the values near to the limits of each range, for example, the number 5 can cause errors if the programmer did not use a correct comparison. One good set of tests for the `ageRange` function would be:
407
+
408
+|      Test      | Expected Result |
409
+|----------------|-----------------|
410
+| `ageRange(5)`  |               0 |
411
+| `ageRange(2)`  |               0 |
412
+| `ageRange(6)`  |               1 |
413
+| `ageRange(18)` |               1 |
414
+| `ageRange(17)` |               1 |
415
+| `ageRange(19)` |               2 |
416
+| `ageRange(25)` |               2 |
417
+
418
+---
419
+
420
+###`Assert` Function:
421
+
422
+The `assert(bool expression)` function can be used as a rudimentary tool to validate functions. `assert` has a very powerful yet simple functionality. If the expression that we place between the `assert` parenthesis is *true*, the function allows the program to continue onto the next instruction. Otherwise, if the expression we place between the parenthesis is *false*, the `assert` function causes the program to terminate and prints an error message on the terminal that informs the user about the `assert` instruction that failed.
423
+
424
+For example, the following program will run from start to finish without problems since every expression included in the assert's parentheses evaluates to *true*.
425
+
426
+---
427
+
428
+```cpp
429
+#include <iostream>
430
+#include <cassert>
431
+using namespace std;
432
+
433
+int main() {
434
+   int i = 10, j = 15;
435
+   assert(i == 10);
436
+   assert(j == i + 5);
437
+   assert(j != i);
438
+   assert( (j < i) == false);
439
+   cout << "That's all, folks!" << endl;
440
+   return 0;
441
+}
442
+
443
+```
444
+
445
+**Figure 1.** Example of a program that passes all of the `assert` tests.
446
+
447
+---
448
+
449
+The following program will not run to completion because the second `assert` (`assert(j == i);`) contains an expression (`j==i`) that evaluates to *false*.
450
+
451
+---
452
+
453
+```cpp
454
+
455
+#include <iostream>
456
+#include <cassert>
457
+using namespace std;
458
+
459
+int main() {
460
+   int i = 10, j = 15;
461
+   assert(i == 10);
462
+   assert(j == i);
463
+   assert(j != i);
464
+   assert( (j < i) == false);
465
+   cout << "That's all, folks!" << endl;
466
+   return 0;
467
+}
468
+
469
+```
470
+
471
+**Figure 2.** Example of a program that does not pass an `assert` test.
472
+
473
+---
474
+
475
+When the program is run, instead of getting the phrase `”That's all, folks!”` in the terminal, we will obtain something like:
476
+
477
+`Assertion failed: (j == i), function main, file ../program01/main.cpp, line 8.`
478
+
479
+The program will not execute the remaining instructions after line 8.
480
+
481
+#### How to use assert to validate functions?
482
+
483
+Suppose that  you want to automate the validation of the `ageRange`. One way to do it is by  implementing and calling a function that calls the `ageRange` function with different arguments and verifies that each returned value is equal to  the expected result. If the `ageRange` function returns a value that is not expected, the testing function aborts the program and reports the test that failed. The following illustrates a function to test the `ageRange` function. Observe that it consists of one assert per each of the tests we had listed earlier. 
484
+
485
+---
486
+
487
+```cpp
488
+void test_ageRange() {
489
+   assert(ageRange(5) == 0);
490
+   assert(ageRange(2) == 0);
491
+   assert(ageRange(6) == 1);
492
+   assert(ageRange(18) == 1);
493
+   assert(ageRange(17) == 1);
494
+   assert(ageRange(19) == 2);
495
+   assert(ageRange(25) == 2);
496
+   cout << "ageRange passed all tests!!!" << endl;
497
+}
498
+```
499
+
500
+**Figure 3.** Example of a test function using `assert`.
501
+
502
+
503
+---
504
+
505
+---
506
+
507
+##Laboratory Session:
508
+
509
+###Exercise 1: Designing tests by hand
510
+
511
+In this exercise you will practice how to design tests to validate functions, using only the function's description and the graphical user interface that is used interact with the function.
512
+
513
+The exercise **DOES NOT require programming**, it only requires that you understand the function’s description, and your ability to design tests. This exercise and Exercise 2 are an adaptation of the exercise in [1].
514
+
515
+**Example 3** Suppose that a friend provides you with a program. She makes sure the program solves the following problem:
516
+
517
+`"given three integers, it displays the max value".`
518
+
519
+Suppose that the program has an interface like the following:
520
+
521
+---
522
+
523
+![figure4.png](images/figure4.png)
524
+
525
+**Figure 4** - Interface for a program that finds the max value out of three integers.
526
+
527
+---
528
+
529
+You could determine if the program provides valid results **without analyzing the source code**. For example, you could try the following cases:
530
+
531
+* a = 4, b = 2, c = 1; expected result: 4
532
+* a = 3, b = 6, c = 2; expected result: 6
533
+* a = 1, b = 10, c = 100; expected result: 100
534
+
535
+If one of these three cases does not have the expected result, your friend's program does not work. On the other hand, if the three cases work, then the program has a high probability of being correct.
536
+
537
+
538
+####Functions to validate
539
+
540
+In this exercise you will be designing tests to validate various versions of the functions that are described below. Each one of the functions has four versions, "Alpha", "Beta", "Gamma" and "Delta".
541
+
542
+* **3 Sorts:** a function that receives three strings and orders them in lexicographic (alphabetical) order. For example, given `giraffe`, `fox`, and `coqui`, it would order them as: `coqui`, `fox`, and `giraffe`. To simplify the exercise, we will be using strings with lowercase **letters**. Figure 5 shows the function's interface. Notice there is a menu to select the implemented version.
543
+
544
+  ---
545
+
546
+    ![figure5.png](images/figure5.png)
547
+
548
+    **Figure 5** - Interface for the `3 Sorts` function.
549
+
550
+  ---
551
+
552
+
553
+* **Dice:** when the user presses the `Roll them!` button, the program generates two random integers between 1 and 6. The program informs the sum of the two random numbers.
554
+
555
+  ---
556
+
557
+    ![figure6.png](images/figure6.png)
558
+
559
+    **Figure 6** - Interface for the `Dice` function.
560
+
561
+  ---
562
+
563
+
564
+* **Rock, Paper, Scissors:** each one of the players enters their play and the program informs who the winner is. Figure 7 shows the options where one object beats the other. The game's interface is shown in Figure 8.
565
+
566
+  ---
567
+
568
+  ![figure7.jpg](images/figure7.jpg)
569
+
570
+  **Figure 7** - Ways to win in "Rock, paper, scissors".
571
+
572
+  ---
573
+
574
+    ![figure8.png](images/figure8.png)
575
+
576
+    **Figure 8** - Interface for the `Rock, Paper, Scissors` function.
577
+
578
+  ---
579
+
580
+
581
+* **Zulu time:** Given a time in Zulu format (time at the Greenwich Meridian) and the military zone in which the user wants to know the time, the program shows the time in that zone. The format for the entry data is in the 24 hour format `####`, for example `2212` would be 10:12pm. The list of valid military zones can be found in http://en.wikipedia.org/wiki/List_of_military_time_zones. The following are examples of some valid results:
582
+
583
+  * Given Zulu time 1230 and zone A (UTC+1), the result should be 1330.
584
+  * Given Zulu time 1230 and zone N (UTC-1), the result should be 1130.
585
+  * Puerto Rico is in military zone Q (UTC-4), therefore, when its 1800 in Zulu time, it's 1400 in Puerto Rico.
586
+
587
+  ---
588
+
589
+    ![figure9.png](images/figure9.png)
590
+
591
+    **Figure 9** - Interface for the `Zulu time` function.
592
+
593
+  ---
594
+
595
+
596
+####Instructions
597
+
598
+1. For each of the functions described above, write in your notebook the tests that you will do to determine the validity of each implementation (Alpha, Beta, Gamma and Delta). For each function, think of the logical errors that the programmer could have made and write tests that determine if these errors were made. For each test, write the values that you will use and the expected result.
599
+
600
+  For example, you could organize your answers in a table like the following:
601
+
602
+
603
+  ---
604
+
605
+
606
+  | 3 Sorts |                           |                           |           |            |            |
607
+  |---------|---------------------------|---------------------------|-----------|------------|------------|
608
+  | Num     | Test                    | Alpha Result              | Beta Result | Gamma Result | Delta Result |
609
+  | 1       | "deer", "coyote", "fox" | "coyote", "deer", "fox" | ....      | ....       |            |
610
+  | 2       | "deer", "fox", "coyote" | "fox", "deer", "coyote" | ....      | ....       |            |
611
+  | ....    | ....                      | ....                      | ....      | ....       | ....       |
612
+
613
+        
614
+  **Figure 10** - Table to organize the test results.
615
+
616
+  ---
617
+
618
+You can see examples of how to organize your results [here](http://i.imgur.com/ggDZ3TQ.png) and [here](http://i.imgur.com/rpApVqm.png).
619
+
620
+
621
+###Exercise 2: Doing tests “by hand”
622
+
623
+The `testing` project implements several versions of each of the four functions that were described in Exercise 1. Some or all of the implementations could be incorrect. Your task is, using the tests you designed in Exercise 1, to test the versions for each function to determine which of them, if any, are implemented correctly.
624
+
625
+This exercise **DOES NOT require programming**, you should make the tests **without looking at the code.**
626
+
627
+####Instructions
628
+
629
+1. Load the `Testing` project onto Qt by double clicking the `Testing.pro` file in the `Documents/eip/Testing` directory on your computer. You can also go to `http://bitbucket.org/eip-uprrp/testing` to downloaded the `Testing` folder on your computer.
630
+
631
+2. Configure the project and run the program. You will see a window similar to the following:
632
+
633
+  ---
634
+
635
+    ![figure11.png](images/figure11.png)
636
+
637
+    **Figure 11** - Window to select the function that will be tested.
638
+
639
+  ---
640
+
641
+3. Select the button for `3 Sorts` and you will obtain the interface in Figure 5.
642
+
643
+4. The "Alpha Version" in the box indicates that you're running the first version of the `3 Sorts` algorithm. Use the tests that you wrote in Exercise 1 to validate the "Alpha Version". Afterwards, do the same with the Beta, Gamma and Delta versions. Write down which are the correct versions of the function (if any), and why. Remember that, for each function, some or all of the implementations could be incorrect. Additionally, specify which tests allowed you to determine the incorrect versions.
644
+
645
+
646
+
647
+###Exercise 3: Using `assert` to make unit tests
648
+
649
+Doing tests by hand each time you run a program is a tiresome task. In the previous exercises you did it for a few simple functions. Imagine doing the same for a complex program like a search engine or a word processor.
650
+
651
+*Unit tests* help programmers validate code and simplify the process of debugging while avoiding having to do these tests by hand in each execution.
652
+
653
+####Instructions:
654
+
655
+1. In the Qt menu, go to `Build` and select `Clean Project "Testing"`.
656
+
657
+2. Load the `UnitTests` project onto Qt by double clicking the `UnitTests.pro` file in the `Documents/eip/Testing` directory on your computer. You can also go to `http://bitbucket.org/eip-uprrp/testing` to download the `Testing` folder on your computer.
658
+
659
+3. The project only contains the source code file `main.cpp`. This file contains four functions: `fact`, `isALetter`, `isValidTime`, and `gcd`, whose results are only partially correct.
660
+
661
+    Study the description of each function that appears as a comment before the function's code to understand the task that the function is supposed to carry out.
662
+
663
+    Your task is to write unit tests for each of the functions to identify the erroneous results. **You do not need to rewrite the functions to correct them.**
664
+
665
+    For the `fact` function, a `test_fact()` is provided as a unit test function. If you invoke the function from `main`, compile and run the program you should obtain a message like the following:
666
+
667
+     `Assertion failed: (fact(2) == 2), function test_fact, file ../UnitTests/ main.cpp, line 69.`
668
+
669
+     This is evidence enough to establish that the `fact` function is NOT correctly implemented.
670
+
671
+4. Notice that, by failing the previous test, the program did not continue its execution. To test the code you will write, comment the `test_fact()` call in `main`.
672
+
673
+5. Write a unit test called `test_isALetter` for the `isALetter` function. Write various asserts in the unit test to try some data and its expected values (use the `test_fact` function for inspiration). Invoke `test_isALetter` from `main` and execute your program. If the `isALetter` function passes the test you wrote, continue writing asserts and executing the program until one of them fails.
674
+
675
+6. Comment the `test_isALetter` call in `main` so you can continue with the other functions.
676
+
677
+7. Repeat the steps in 5 and 6 for the other two functions, `isValidTime` and `gcd`. Remember that you should call each of the unit test functions from `main` for them to run.     
678
+
679
+---
680
+
681
+---
682
+
683
+##Deliverables
684
+
685
+1. Use "Deliverables 1" in Moodle to hand in the table with the tests you designed in Exercise 1 and that you completed in Exercise 2 with the results from the function tests.
686
+
687
+2. Use "Deliverables 2" in Moodle to hand in the `main.cpp` file that contains the `test_isALetter`, `test_isValidTime`, `test_gcd` functions and their calls. Remember to use good programming techniques, include the name of the programmers involved and document your program.
688
+
689
+---
690
+
691
+---
692
+
693
+## References
694
+
695
+[1] http://nifty.stanford.edu/2005/TestMe/
696
+
697
+---
698
+
699
+---
700
+
701
+---
702
+
703
+

+ 0
- 1
Testing.pro View File

25
 
25
 
26
 RESOURCES += \
26
 RESOURCES += \
27
     images.qrc
27
     images.qrc
28
-

+ 7
- 0
UnitTests/UnitTests.pro View File

1
+TEMPLATE = app
2
+CONFIG += console
3
+CONFIG -= app_bundle
4
+CONFIG -= qt
5
+
6
+SOURCES += main.cpp
7
+

+ 130
- 0
UnitTests/main.cpp View File

1
+#include <iostream>
2
+#include <cassert>
3
+
4
+using namespace std;
5
+
6
+//
7
+// Function fact(n): Given a positive number n will return its factorial.
8
+//
9
+unsigned int fact(unsigned int n) {
10
+
11
+    if (n <= 0) return 0;
12
+
13
+    int result = 1;
14
+
15
+    for (int i = 1; i < n; i++)
16
+        result = result * i;
17
+
18
+    return result;
19
+}
20
+
21
+
22
+// 
23
+// Function isALetter(c):
24
+// Given a character c will return true if it is a letter,
25
+// otherwise returns false.
26
+//
27
+
28
+bool isALetter(char c) {
29
+    return ( c >= 'A' && c <= 'z');
30
+}
31
+
32
+//
33
+// Function isValidTime(n:
34
+// Given a time in military format, e.g. 1147, determines if it is valid. 
35
+// Returns true if valid, false otherwise.
36
+//
37
+
38
+bool isValidTime(unsigned int n) {
39
+    return ( n >= 0 && n <= 2359 );
40
+}
41
+
42
+
43
+//
44
+// Function gcd(a,b):
45
+// Given two positive integeres, determines their greatest common divisor 
46
+// and returns it.
47
+//
48
+
49
+int gcd ( int a, int b ) {
50
+    int c;
51
+
52
+    while ( a > 1 ) {
53
+        c = a;
54
+        a = b % a;
55
+        b = c;
56
+    }
57
+    return b;
58
+}
59
+
60
+
61
+//
62
+// Function test_fact():
63
+// This function is provided as an example unit test for the fact() function. 
64
+//
65
+
66
+void test_fact() {
67
+    assert( fact(1) == 1 );
68
+    assert( fact(2) == 2);
69
+    assert( fact(4) == 24);
70
+    cout << "Function fact() passed all the tests!!" << endl;
71
+}
72
+
73
+//
74
+// EXERCISE 3
75
+//
76
+
77
+
78
+//
79
+// Function test_isALetter():
80
+// This function is provided as an example unit test for the isALetter() function.
81
+//
82
+
83
+void test_isALetter() {
84
+    assert( isALetter('a') );
85
+    assert( isALetter('Z'));
86
+    assert( isALetter('2')==0);
87
+    assert( isALetter('$')==0);
88
+    assert( isALetter('^')==0);
89
+    cout << "Function isALetter() passed all the tests!!" << endl;
90
+}
91
+
92
+//
93
+// Function test_isValidTime():
94
+// This function is provided as an example unit test for the isValidTime() function.
95
+//
96
+
97
+void test_isValidTime() {
98
+    assert( isValidTime(0002) );
99
+    assert( isValidTime(1234) );
100
+    assert( isValidTime(4800)==0 );
101
+    assert( isValidTime(1278)==0 );
102
+    cout << "Function isValidTime() passed all the tests!!" << endl;
103
+}
104
+
105
+//
106
+// Function test_gcd():
107
+// This function is provided as an example unit test for the gcd() function.
108
+//
109
+
110
+void test_gcd() {
111
+    assert( gcd(1,1)==1 );
112
+    assert( gcd(2,2)==2 );
113
+    assert( gcd(3,2)==1 );
114
+    assert( gcd(12,9)==3 );
115
+    assert( gcd(12,6)==6 );
116
+    cout << "Function gcd() passed all the tests!!" << endl;
117
+}
118
+
119
+
120
+
121
+int main()
122
+{
123
+    cout << "Go ahead and test!\n";
124
+    test_fact();
125
+ // test_gcd();
126
+ // test_isALetter();
127
+ // test_isValidTime();
128
+    
129
+    return 0;
130
+}

+ 265
- 42
functions.cpp View File

111
 }
111
 }
112
 
112
 
113
 
113
 
114
+//========================================================
115
+// Functions for the dice roller
116
+//========================================================
117
+
118
+//This is the correct dice roller
119
+void MainWindow::diceAlpha(){
120
+    int total = diceFinal01 + diceFinal02 + 2;
121
+    line[0]->setText(QString::number(total));
122
+}
114
 
123
 
124
+//This version sums the first dice twice
125
+void MainWindow::diceBeta(){
126
+    int total = diceFinal01 + diceFinal01 + 2;
127
+    line[0]->setText(QString::number(total));
128
+}
129
+
130
+//This one substracts the second dice to the first one
131
+void MainWindow::diceGamma(){
132
+    int total = diceFinal01 - diceFinal02;
133
+    line[0]->setText(QString::number(total));
134
+}
135
+
136
+//This one takes the number 6 as a 12
137
+void MainWindow::diceDelta(){
138
+    int total = diceFinal01 + diceFinal02;
139
+    line[0]->setText(QString::number(total));
140
+}
115
 
141
 
116
 // =========================================================
142
 // =========================================================
117
 // Rock Paper Scissor Functions
143
 // Rock Paper Scissor Functions
118
 // =========================================================
144
 // =========================================================
119
 
145
 
120
 
146
 
147
+
121
 int RPSAlpha(char p1, char p2) {
148
 int RPSAlpha(char p1, char p2) {
122
     p1 = toupper(p1);
149
     p1 = toupper(p1);
123
     p2 = toupper(p2);
150
     p2 = toupper(p2);
124
     if ( p1 == 'P' ) {
151
     if ( p1 == 'P' ) {
125
-        if ( p2 == 'P' )    return TIE;
126
-        else if (p2 == 'R') return P1_WON;
127
-        else                return P2_WON;
152
+        if ( p2 == 'P' )    return 0;
153
+        else if (p2 == 'R') return 1;
154
+        else                return 2;
128
     }
155
     }
129
 
156
 
130
     else if (p1 == 'R') {
157
     else if (p1 == 'R') {
131
-        if ( p2 == 'R' )    return TIE;
132
-        else if (p2 == 'S') return P1_WON;
133
-        else                return P2_WON;
158
+        if ( p2 == 'R' )    return 0;
159
+        else if (p2 == 'S') return 1;
160
+        else                return 2;
134
     }
161
     }
135
 
162
 
136
     else {
163
     else {
137
-        if ( p2 == 'S' )    return TIE;
138
-        else if (p2 == 'P') return P1_WON;
139
-        else                return P2_WON;
164
+        if ( p2 == 'S' )    return 0;
165
+        else if (p2 == 'P') return 1;
166
+        else                return 2;
140
     }
167
     }
141
 }
168
 }
142
 
169
 
145
     p1 = toupper(p1);
172
     p1 = toupper(p1);
146
     p2 = toupper(p2);
173
     p2 = toupper(p2);
147
     if ( p1 == 'P' ) {
174
     if ( p1 == 'P' ) {
148
-        if ( p2 == 'S' )    return TIE;
149
-        else if (p2 == 'R') return P1_WON;
150
-        else                return P2_WON;
175
+        if ( p2 == 'S' )    return 0;
176
+        else if (p2 == 'R') return 1;
177
+        else                return 2;
151
     }
178
     }
152
     else if (p1 == 'R') {
179
     else if (p1 == 'R') {
153
-        if ( p2 == 'S' )    return TIE;
154
-        else if (p2 == 'P') return P1_WON;
155
-        else                return P2_WON;
180
+        if ( p2 == 'S' )    return 0;
181
+        else if (p2 == 'P') return 1;
182
+        else                return 2;
156
     }
183
     }
157
 
184
 
158
     else {
185
     else {
159
-        if ( p2 == 'S' )    return TIE;
160
-        else if (p2 == 'R') return P1_WON;
161
-        else                return P2_WON;
186
+        if ( p2 == 'S' )    return 0;
187
+        else if (p2 == 'R') return 1;
188
+        else                return 2;
162
     }
189
     }
163
 }
190
 }
164
 
191
 
168
     p1 = toupper(p1);
195
     p1 = toupper(p1);
169
     p2 = toupper(p2);
196
     p2 = toupper(p2);
170
     if ( p1 == 'P' ) {
197
     if ( p1 == 'P' ) {
171
-        if ( p2 == 'P' )    return TIE;
172
-        else if (p2 == 'S') return P1_WON;
173
-        else                return P2_WON;
198
+        if ( p2 == 'P' )    return 0;
199
+        else if (p2 == 'S') return 1;
200
+        else                return 2;
174
     }
201
     }
175
     else if (p1 == 'R') {
202
     else if (p1 == 'R') {
176
-        if ( p2 == 'R' )    return TIE;
177
-        else if (p2 == 'P') return P1_WON;
178
-        else                return P2_WON;
203
+        if ( p2 == 'R' )    return 0;
204
+        else if (p2 == 'P') return 1;
205
+        else                return 2;
179
     }
206
     }
180
     else {
207
     else {
181
-        if ( p2 == 'P' )    return TIE;
182
-        else if (p2 == 'S') return P1_WON;
183
-        else                return P2_WON;
208
+        if ( p2 == 'P' )    return 0;
209
+        else if (p2 == 'S') return 1;
210
+        else                return 2;
184
     }
211
     }
185
 }
212
 }
186
 
213
 
187
 
214
 
215
+
188
 int RPSDelta(char p1, char p2) {
216
 int RPSDelta(char p1, char p2) {
189
     p1 = toupper(p1);
217
     p1 = toupper(p1);
190
     p2 = toupper(p2);
218
     p2 = toupper(p2);
191
     if ( p1 == 'P' ) {
219
     if ( p1 == 'P' ) {
192
-        if ( p2 == 'P' )    return TIE;
193
-        else if (p2 == 'S') return P1_WON;
194
-        else                return P2_WON;
220
+        if ( p2 == 'P' )    return 0;
221
+        else if (p2 == 'S') return 1;
222
+        else                return 2;
195
     }
223
     }
196
     else if (p1 == 'R') {
224
     else if (p1 == 'R') {
197
-        if ( p2 == 'R' )    return TIE;
198
-        else if (p2 == 'P') return P1_WON;
199
-        else                return P2_WON;
225
+        if ( p2 == 'R' )    return 0;
226
+        else if (p2 == 'P') return 1;
227
+        else                return 2;
200
     }
228
     }
201
     else {
229
     else {
202
-        if ( p2 == 'P' )    return TIE;
203
-        else if (p2 == 'S') return P1_WON;
204
-        else                return P2_WON;
230
+        if ( p2 == 'P' )    return 0;
231
+        else if (p2 == 'S') return 1;
232
+        else                return 2;
205
     }
233
     }
206
 }
234
 }
207
 
235
 
213
 
241
 
214
 QMap<int,QString> M;
242
 QMap<int,QString> M;
215
 
243
 
244
+///
245
+/// \brief initCheckWMaps: initialize the values in the dictionary that is used throughout
246
+///                        the check functions.
247
+///
248
+
216
 void initCheckWMaps() {
249
 void initCheckWMaps() {
217
 
250
 
218
     M[1] = "one";       M[2] = "two";       M[3]  = "three";      M[4] = "four";
251
     M[1] = "one";       M[2] = "two";       M[3]  = "three";      M[4] = "four";
226
 }
259
 }
227
 
260
 
228
 
261
 
262
+///
263
+/// \brief validateCheckQty: determines is entered text is a valid number in [0,999999999]
264
+/// \param st text entered by the user
265
+/// \param qty text converted to integer
266
+/// \return true if the entered text is valid
267
+///
268
+
229
 bool validateCheckQty(QString st, unsigned int &qty) {
269
 bool validateCheckQty(QString st, unsigned int &qty) {
230
     int i = 0;
270
     int i = 0;
231
     for (i = 0; i < st.length() ; i++) {
271
     for (i = 0; i < st.length() ; i++) {
238
     return true;
278
     return true;
239
 }
279
 }
240
 
280
 
281
+///
282
+/// \brief wordForNumber: Given a number n in [0,999] returns the word equivalent
283
+/// \param n: the number
284
+/// \return a Qstring containing the number in words
285
+///
241
 
286
 
242
-
243
-QString wordForNumber(unsigned int n) {
287
+QString wordForNumber(int n) {
244
     QString st;
288
     QString st;
245
 
289
 
246
     int tens = n % 100;
290
     int tens = n % 100;
261
 }
305
 }
262
 
306
 
263
 
307
 
308
+///
309
+/// \brief checkWAlpha: One of the functions to convert a number in [0,999999999] to words
310
+/// \param n: the number
311
+/// \return a Qstring containing the number in words
312
+///
264
 
313
 
265
-QString checkWAlpha(unsigned int n) {
314
+QString checkWAlpha(int n) {
266
     QString st;
315
     QString st;
267
 
316
 
268
     // the cents
317
     // the cents
279
     return st;
328
     return st;
280
 }
329
 }
281
 
330
 
331
+///
332
+/// \brief checkWBeta: One of the functions to convert a number in [0,999999999] to words
333
+/// \param n: the number
334
+/// \return a Qstring containing the number in words
335
+///
282
 
336
 
283
-QString checkWBeta(unsigned int n) {
337
+QString checkWBeta(int n) {
284
     QString st;
338
     QString st;
285
 
339
 
286
     st = wordForNumber(n % 1000);
340
     st = wordForNumber(n % 1000);
292
     return st;
346
     return st;
293
 }
347
 }
294
 
348
 
349
+///
350
+/// \brief checkWGamma: One of the functions to convert a number in [0,999999999] to words
351
+/// \param n: the number
352
+/// \return a Qstring containing the number in words
353
+///
295
 
354
 
296
-QString checkWGamma(unsigned int n) {
355
+QString checkWGamma(int n) {
297
     QString st;
356
     QString st;
298
 
357
 
299
     st = wordForNumber(n % 10);
358
     st = wordForNumber(n % 10);
305
     return st;
364
     return st;
306
 }
365
 }
307
 
366
 
367
+///
368
+/// \brief checkWDelta: One of the functions to convert a number in [0,999999999] to words
369
+/// \param n: the number
370
+/// \return a Qstring containing the number in words
371
+///
308
 
372
 
309
 
373
 
310
-QString checkWDelta(unsigned int n) {
374
+QString checkWDelta(int n) {
311
     QString st;
375
     QString st;
312
 
376
 
313
     n /= 10;
377
     n /= 10;
342
     return true;
406
     return true;
343
 }
407
 }
344
 
408
 
409
+//This is the correct one
345
 
410
 
346
 QString zuluAlpha(int hours, int minutes, char zone) {
411
 QString zuluAlpha(int hours, int minutes, char zone) {
347
     int diff = 0;
412
     int diff = 0;
399
 
464
 
400
     return QString::number(hours)  + QString::number(minutes);
465
     return QString::number(hours)  + QString::number(minutes);
401
 }
466
 }
467
+
468
+
469
+
470
+// =========================================================
471
+// APFT Functions
472
+// =========================================================
473
+
474
+
475
+//This it the correct one
476
+
477
+void MainWindow::APFTAlpha(){
478
+    //For each one of these variables we apply the formula that they use
479
+    //to set the points
480
+    double sit_ups = qFloor(line[0]->text().toDouble() * 1.6 - 24.8);
481
+
482
+    double push_ups = qFloor(line[1]->text().toInt() * 1.42);
483
+
484
+    double running_time = qFloor((line[2]->text().left(2).append('.' + line[2]->text().right(2))).toDouble());
485
+    double two_mile_run = qFloor((820 / 3) - ((40 * running_time) / 3));
486
+
487
+    //Since the maximum of points that one can obtain
488
+    //on each excercise type is 100, we restrict it
489
+    if (sit_ups > 100){
490
+        sit_ups = 100;
491
+    }
492
+    else if (sit_ups < 0){
493
+        sit_ups = 0;
494
+    }
495
+    if (push_ups > 100){
496
+        push_ups = 100;
497
+    }
498
+    else if (push_ups < 0){
499
+        push_ups = 0;
500
+    }
501
+    if (two_mile_run > 100){
502
+        two_mile_run = 100;
503
+    }
504
+    else if (two_mile_run < 0){
505
+        two_mile_run = 0;
506
+    }
507
+
508
+    //Finally we set the outputs.
509
+    line[3]->setText(QString::number(sit_ups));
510
+    line[4]->setText(QString::number(push_ups));
511
+    line[5]->setText(QString::number(two_mile_run));
512
+    line[6]->setText(QString::number(push_ups + sit_ups + two_mile_run));
513
+    if (push_ups >= 60 && sit_ups >= 60 && two_mile_run >= 60){
514
+        label[7]->setText("PASS");
515
+    }
516
+    else{
517
+        label[7]->setText("FAIL");
518
+    }
519
+}
520
+
521
+//This one do not check if the number is greater than 100
522
+
523
+void MainWindow::APFTBeta(){
524
+    double sit_ups = qFloor(line[0]->text().toDouble() * 1.6 - 24.8);
525
+
526
+    double push_ups = qFloor(line[1]->text().toInt() * 1.42);
527
+
528
+    double running_time = qFloor((line[2]->text().left(2).append('.' + line[2]->text().right(2))).toDouble());
529
+    double two_mile_run = qFloor((820 / 3) - ((40 * running_time) / 3));
530
+
531
+    line[3]->setText(QString::number(sit_ups));
532
+    line[4]->setText(QString::number(push_ups));
533
+    line[5]->setText(QString::number(two_mile_run));
534
+    line[6]->setText(QString::number(push_ups + sit_ups + two_mile_run));
535
+    if (push_ups >= 60 && sit_ups >= 60 && two_mile_run >= 60){
536
+        line[7]->setText("PASS");
537
+    }
538
+    else{
539
+        line[7]->setText("FAIL");
540
+    }
541
+}
542
+
543
+//This one switch the results
544
+
545
+void MainWindow::APFTGamma(){
546
+    double sit_ups = qFloor(line[0]->text().toDouble() * 1.6 - 24.8);
547
+    double push_ups = qFloor(line[1]->text().toInt() * 1.42);
548
+    double running_time = qFloor((line[2]->text().left(2).append('.' + line[2]->text().right(2))).toDouble());
549
+    double two_mile_run = qFloor((820 / 3) - ((40 * running_time) / 3));
550
+
551
+    if (sit_ups > 100){
552
+        sit_ups = 100;
553
+    }
554
+    else if (sit_ups < 0){
555
+        sit_ups = 0;
556
+    }
557
+    if (push_ups > 100){
558
+        push_ups = 100;
559
+    }
560
+    else if (push_ups < 0){
561
+        push_ups = 0;
562
+    }
563
+    if (two_mile_run > 100){
564
+        two_mile_run = 100;
565
+    }
566
+    else if (two_mile_run < 0){
567
+        two_mile_run = 0;
568
+    }
569
+
570
+    line[5]->setText(QString::number(sit_ups));
571
+    line[3]->setText(QString::number(push_ups));
572
+    line[4]->setText(QString::number(two_mile_run));
573
+    line[6]->setText(QString::number(push_ups + sit_ups + two_mile_run));
574
+    if (push_ups >= 60 && sit_ups >= 60 && two_mile_run >= 60){
575
+        line[7]->setText("PASS");
576
+    }
577
+    else{
578
+        line[7]->setText("FAIL");
579
+    }
580
+}
581
+
582
+//This one do not sums the points but the quantities of each excercise
583
+
584
+void MainWindow::APFTDelta(){
585
+    double sit_ups = qFloor(line[0]->text().toDouble() * 1.6 - 24.8);
586
+    double push_ups = qFloor(line[1]->text().toInt() * 1.42);
587
+    double running_time = qFloor((line[2]->text().left(2).append('.'
588
+                                   + line[2]->text().right(2))).toDouble());
589
+    double two_mile_run = qFloor((820 / 3) - ((40 * running_time) / 3));
590
+
591
+    if (sit_ups > 100){
592
+        sit_ups = 100;
593
+    }
594
+    else if (sit_ups < 0){
595
+        sit_ups = 0;
596
+    }
597
+    if (push_ups > 100){
598
+        push_ups = 100;
599
+    }
600
+    else if (push_ups < 0){
601
+        push_ups = 0;
602
+    }
603
+    if (two_mile_run > 100){
604
+        two_mile_run = 100;
605
+    }
606
+    else if (two_mile_run < 0){
607
+        two_mile_run = 0;
608
+    }
609
+
610
+    int sumaTo = line[0]->text().toInt() + line[1]->text().toInt() + running_time;
611
+    line[3]->setText(QString::number(sit_ups));
612
+    line[4]->setText(QString::number(push_ups));
613
+    line[5]->setText(QString::number(two_mile_run));
614
+    line[6]->setText(QString::number(sumaTo));
615
+    if (push_ups >= 60 && sit_ups >= 60 && two_mile_run >= 60){
616
+        line[7]->setText("PASS");
617
+    }
618
+    else{
619
+        line[7]->setText("FAIL");
620
+    }
621
+}
622
+
623
+
624
+

+ 4
- 292
functions.h View File

4
 #include <string>
4
 #include <string>
5
 using namespace std;
5
 using namespace std;
6
 
6
 
7
-
8
-/// \fn validateSorts
9
-/// \~English
10
-/// \brief Function to validate that sort is invoked with non-empty strings
11
-/// \param a first QSring
12
-/// \param b second Qstring
13
-/// \param c third QString
14
-/// \return true if non of the QStrings are empty
15
-/// \~Spanish
16
-/// \brief Valida que los QStrings que se van a ordenar no estén vacios.
17
-/// \param a primer QSring
18
-/// \param b segundo Qstring
19
-/// \param c tercer QString
20
-/// \return true si ninguno de los QString está vacio
21
 bool validateSorts(const QString &a, const QString &b, const QString &c);
7
 bool validateSorts(const QString &a, const QString &b, const QString &c);
22
-
23
-/// \fn mySortAlpha
24
-/// \~English
25
-/// \brief A function to sort the QStrings. Returns the order 
26
-/// strings through the parameters (a is smallest, c is largest).
27
-/// \param a reference to first QSring
28
-/// \param b reference to second Qstring
29
-/// \param c reference to third QString
30
-/// \~Spanish
31
-/// \brief Función para ordenar QStrings. Devuelve los QStrings
32
-/// ordenados a través de los parámetros (a para el menor, c para el mayor).
33
-/// \param a referencia al primer QSring
34
-/// \param b referencia al segundo Qstring
35
-/// \param c referencia al tercer QString
36
 void mySortAlpha(QString &a, QString &b, QString &c);
8
 void mySortAlpha(QString &a, QString &b, QString &c);
37
-
38
-/// \fn mySortBeta
39
-/// \~English
40
-/// \brief A function to sort the QStrings. Returns the order 
41
-/// strings through the parameters (a is smallest, c is largest).
42
-/// \param a reference to first QSring
43
-/// \param b reference to second Qstring
44
-/// \param c reference to third QString
45
-/// \~Spanish
46
-/// \brief Función para ordenar QStrings. Devuelve los QStrings
47
-/// ordenados a través de los parámetros (a para el menor, c para el mayor).
48
-/// \param a referencia al primer QSring
49
-/// \param b referencia al segundo Qstring
50
-/// \param c referencia al tercer QString
51
 void mySortBeta(QString &a, QString &b, QString &c);
9
 void mySortBeta(QString &a, QString &b, QString &c);
52
-
53
-/// \fn mySortGamma
54
-/// \~English
55
-/// \brief A function to sort the QStrings. Returns the order 
56
-/// strings through the parameters (a is smallest, c is largest).
57
-/// \param a reference to first QSring
58
-/// \param b reference to second Qstring
59
-/// \param c reference to third QString
60
-/// \~Spanish
61
-/// \brief Función para ordenar QStrings. Devuelve los QStrings
62
-/// ordenados a través de los parámetros (a para el menor, c para el mayor).
63
-/// \param a referencia al primer QSring
64
-/// \param b referencia al segundo Qstring
65
-/// \param c referencia al tercer QString
66
 void mySortGamma(QString &a, QString &b, QString &c);
10
 void mySortGamma(QString &a, QString &b, QString &c);
67
-
68
-/// \fn mySortDelta
69
-/// \~English
70
-/// \brief First function to sort the QStrings. Returns the order 
71
-/// strings through the parameters (a is smallest, c is largest).
72
-/// \param a reference to first QSring
73
-/// \param b reference to second Qstring
74
-/// \param c reference to third QString
75
-/// \~Spanish
76
-/// \brief Función para ordenar QStrings. Devuelve los QStrings
77
-/// ordenados a través de los parámetros (a para el menor, c para el mayor).
78
-/// \param a referencia al primer QSring
79
-/// \param b referencia al segundo Qstring
80
-/// \param c referencia al tercer QString
81
 void mySortDelta(QString &a, QString &b, QString &c);
11
 void mySortDelta(QString &a, QString &b, QString &c);
82
 
12
 
83
-
84
-/// \fn validZuluTime
85
-/// \~English
86
-/// \brief Function to validate the arguments that will be passed to the
87
-///  Zulu functions.  Returns the integer hour and minutes through last two parameters.
88
-/// \param time QString that contains the time in military format.
89
-/// \param zone  QString that specifies military zone.
90
-/// \param hours hours, extracted from the time parameter
91
-/// \param minutes minutes, extracted from the time parameter
92
-/// \return true if the time and zone are valid. 
93
-/// \~Spanish
94
-/// \brief Función para validar los argumentos que serán pasados a
95
-/// funciones Zulu.  Devuelve (como enteros) la hora y minutos a través de los 
96
-/// últimos dos parámetros.
97
-/// \param time QString que contiene la hora en formato militar, e.g. "15:22"
98
-/// \param zone  QString que contiene zona militar.
99
-/// \param hours horas, extraida del argumento pasado a time.
100
-/// \param minutes minutos, extraidos del argumento pasado a time.
101
-/// \return true si la hora (time) y la zona son válidas. 
102
 bool validZuluTime(const QString &time, const QString &zone, int &hours, int &minutes);
13
 bool validZuluTime(const QString &time, const QString &zone, int &hours, int &minutes);
103
-
104
-
105
-/// \fn zuluAlpha
106
-/// \~English
107
-/// \brief Given the hour, minutes and military zone returns the Zulu time (as a QString)
108
-/// \param hours 
109
-/// \param minutes 
110
-/// \param zone 
111
-/// \return a QString of the Zulu time, in military time format
112
-/// \~Spanish
113
-/// \brief Dado la hora, minutos y zona militar devuelve el tiempo Zulu (como QString)
114
-/// \param hours 
115
-/// \param minutes 
116
-/// \param zone 
117
-/// \return un QString del tiempo Zulu, en formato de hora militar.
118
 QString zuluAlpha(int hours, int minutes, char zone);
14
 QString zuluAlpha(int hours, int minutes, char zone);
119
-
120
-
121
-/// \fn zuluBeta
122
-/// \~English
123
-/// \brief Given the hour, minutes and military zone returns the Zulu time (as a QString)
124
-/// \param hours 
125
-/// \param minutes 
126
-/// \param zone 
127
-/// \return a QString of the Zulu time, in military time format
128
-/// \~Spanish
129
-/// \brief Dado la hora, minutos y zona militar devuelve el tiempo Zulu (como QString)
130
-/// \param hours 
131
-/// \param minutes 
132
-/// \param zone 
133
-/// \return un QString del tiempo Zulu, en formato de hora militar.
134
 QString zuluBeta(int hours, int minutes, char zone);
15
 QString zuluBeta(int hours, int minutes, char zone);
135
-
136
-
137
-/// \fn zuluGamma
138
-/// \~English
139
-/// \brief Given the hour, minutes and military zone returns the Zulu time (as a QString)
140
-/// \param hours 
141
-/// \param minutes 
142
-/// \param zone 
143
-/// \return a QString of the Zulu time, in military time format
144
-/// \~Spanish
145
-/// \brief Dado la hora, minutos y zona militar devuelve el tiempo Zulu (como QString)
146
-/// \param hours 
147
-/// \param minutes 
148
-/// \param zone 
149
-/// \return un QString del tiempo Zulu, en formato de hora militar.
150
 QString zuluGamma(int hours, int minutes, char zone);
16
 QString zuluGamma(int hours, int minutes, char zone);
151
-
152
-
153
-/// \fn zuluDelta
154
-/// \~English
155
-/// \brief Given the hour, minutes and military zone returns the Zulu time (as a QString)
156
-/// \param hours 
157
-/// \param minutes 
158
-/// \param zone 
159
-/// \return a QString of the Zulu time, in military time format
160
-/// \~Spanish
161
-/// \brief Dado la hora, minutos y zona militar devuelve el tiempo Zulu (como QString)
162
-/// \param hours 
163
-/// \param minutes 
164
-/// \param zone 
165
-/// \return un QString del tiempo Zulu, en formato de hora militar.
166
 QString zuluDelta(int hours, int minutes, char zone);
17
 QString zuluDelta(int hours, int minutes, char zone);
167
 
18
 
168
-
169
-// Constants for the rock, paper, scisor functions.
170
-const int TIE = 0;
171
-const int P1_WON = 1;
172
-const int P2_WON = 2;
173
-
174
-
175
-/// \fn RPSAlpha
176
-/// \~English
177
-/// \brief Given play by the first and second players, returns who won the rock, paper
178
-/// scisors match.
179
-/// \param p1 play by the first player, as represented by char 'R', 'P' or 'S' 
180
-/// \param p2 play by the first player, as represented by char 'R', 'P' or 'S'  
181
-/// \return a 0 if there was a tie, 1 if the first player won, 2 if the second player won.
182
-/// \~Spanish
183
-/// \brief Dado la jugada del jugador 1 y 2, devuelve quien ganó el juego de piedra, 
184
-/// papel y tijera ((R)ock, (P)aper, (S)cisors)
185
-/// \param p1 jugada del primer jugador, representada por un caracter ('R','P','S') 
186
-/// \param p1 jugada del segundo jugador, representada por un caracter ('R','P','S')
187
-/// \return a 0 si hubo empate, 1 si ganó el primer jugador, 2 si ganó el segundo.
188
 int RPSAlpha(char p1, char p2);
19
 int RPSAlpha(char p1, char p2);
189
-
190
-/// \fn RPSBeta
191
-/// \~English
192
-/// \brief Given play by the first and second players, returns who won the rock, paper
193
-/// scisors match.
194
-/// \param p1 play by the first player, as represented by char 'R', 'P' or 'S' 
195
-/// \param p2 play by the first player, as represented by char 'R', 'P' or 'S'  
196
-/// \return a 0 if there was a tie, 1 if the first player won, 2 if the second player won.
197
-/// \~Spanish
198
-/// \brief Dado la jugada del jugador 1 y 2, devuelve quien ganó el juego de piedra, 
199
-/// papel y tijera ((R)ock, (P)aper, (S)cisors)
200
-/// \param p1 jugada del primer jugador, representada por un caracter ('R','P','S') 
201
-/// \param p1 jugada del segundo jugador, representada por un caracter ('R','P','S')
202
-/// \return a 0 si hubo empate, 1 si ganó el primer jugador, 2 si ganó el segundo.
203
 int RPSBeta(char p1, char p2);
20
 int RPSBeta(char p1, char p2);
204
-
205
-/// \fn RPSGamma
206
-/// \~English
207
-/// \brief Given play by the first and second players, returns who won the rock, paper
208
-/// scisors match.
209
-/// \param p1 play by the first player, as represented by char 'R', 'P' or 'S' 
210
-/// \param p2 play by the first player, as represented by char 'R', 'P' or 'S'  
211
-/// \return a 0 if there was a tie, 1 if the first player won, 2 if the second player won.
212
-/// \~Spanish
213
-/// \brief Dado la jugada del jugador 1 y 2, devuelve quien ganó el juego de piedra, 
214
-/// papel y tijera ((R)ock, (P)aper, (S)cisors)
215
-/// \param p1 jugada del primer jugador, representada por un caracter ('R','P','S') 
216
-/// \param p1 jugada del segundo jugador, representada por un caracter ('R','P','S')
217
-/// \return a 0 si hubo empate, 1 si ganó el primer jugador, 2 si ganó el segundo.
218
 int RPSGamma(char p1, char p2);
21
 int RPSGamma(char p1, char p2);
219
-
220
-/// \fn RPSDelta
221
-/// \~English
222
-/// \brief Given play by the first and second players, returns who won the rock, paper
223
-/// scisors match.
224
-/// \param p1 play by the first player, as represented by char 'R', 'P' or 'S' 
225
-/// \param p2 play by the first player, as represented by char 'R', 'P' or 'S'  
226
-/// \return a 0 if there was a tie, 1 if the first player won, 2 if the second player won.
227
-/// \~Spanish
228
-/// \brief Dado la jugada del jugador 1 y 2, devuelve quien ganó el juego de piedra, 
229
-/// papel y tijera ((R)ock, (P)aper, (S)cisors)
230
-/// \param p1 jugada del primer jugador, representada por un caracter ('R','P','S') 
231
-/// \param p1 jugada del segundo jugador, representada por un caracter ('R','P','S')
232
-/// \param zone 
233
-/// \return a 0 si hubo empate, 1 si ganó el primer jugador, 2 si ganó el segundo.
234
 int RPSDelta(char p1, char p2);
22
 int RPSDelta(char p1, char p2);
235
 
23
 
236
-
237
-/// \fn initCheckWMaps
238
-/// \~English
239
-/// \brief Initialize the values in the dictionary (M) that is used throughout
240
-/// the check functions.
241
-/// \~Spanish
242
-/// \brief Inicializa los valores del diccionario que se utiliza a través del 
243
-/// las funciones 'check' 
244
 void initCheckWMaps();
24
 void initCheckWMaps();
245
-
246
-
247
-
248
-/// \fn validateCheckQty
249
-/// \~English
250
-/// \brief Given a QString determines its numerical value and if the 
251
-/// the value is in the range [0,999999999]
252
-/// \param st a QString with a numeric value, e.g. "4520"
253
-/// \param qty unsigned integer to return the numeric value, e.g. 4520
254
-/// \return true if the QString was converted to an integer and is in the valid range
255
-/// \~Spanish
256
-/// \brief Dado un string determina su valor numérico y si el valor está en el 
257
-/// rango [0,999999999]
258
-/// \param st un QString con un valor numérico, e.g. "4520"
259
-/// \param qty entero sin signo para devolver el valor numérico, e.g. 4520
260
-/// \return true si el QString se pudo convertir a entero y está en el rango
261
 bool validateCheckQty(QString st, unsigned int &qty);
25
 bool validateCheckQty(QString st, unsigned int &qty);
262
-
263
-
264
-/// \fn wordForNumber
265
-/// \~English
266
-/// \brief Given a number n in [0,999] returns the word equivalent
267
-/// \param n the unsigned integer, e.g. 34
268
-/// \return a QString containing the number in words, e.g. "thirty four"
269
-/// \~Spanish
270
-/// \brief Dado un número entero en el rango [0,999] devuelve su representación en palabras
271
-/// \param n el entero sin signo, e.g. 34
272
-/// \return un QString que contiene el valor en palabras, e.g. "thirty four"
273
-QString wordForNumber(unsigned int n);
274
-
275
-/// \fn checkWAlpha
276
-/// \~English
277
-/// \brief Given a unsigned integer returns its value as a string of words (in English)
278
-/// \param n the unsigned integer, e.g. 42
279
-/// \return QString containing the value (in words), e.g. "fourty two"
280
-/// \~Spanish
281
-/// \brief Dado un entero sin signo devuelve su valor como un string de palabras (in English)
282
-/// \param n el entero sin signo, e.g. 42
283
-/// \return QString que contien el valor en palabras, e.g. "fourty two"
284
-QString checkWAlpha(unsigned int n);
285
-
286
-/// \fn checkWBeta
287
-/// \~English
288
-/// \brief Given a unsigned integer returns its value as a string of words (in English)
289
-/// \param n the unsigned integer, e.g. 42
290
-/// \return QString containing the value (in words), e.g. "fourty two"
291
-/// \~Spanish
292
-/// \brief Dado un entero sin signo devuelve su valor como un string de palabras (in English)
293
-/// \param n el entero sin signo, e.g. 42
294
-/// \return QString que contien el valor en palabras, e.g. "fourty two"
295
-QString checkWBeta(unsigned int n);
296
-
297
-/// \fn checkWGamma
298
-/// \~English
299
-/// \brief Given a unsigned integer returns its value as a string of words (in English)
300
-/// \param n the unsigned integer, e.g. 42
301
-/// \return QString containing the value (in words), e.g. "fourty two"
302
-/// \~Spanish
303
-/// \brief Dado un entero sin signo devuelve su valor como un string de palabras (in English)
304
-/// \param n el entero sin signo, e.g. 42
305
-/// \return QString que contien el valor en palabras, e.g. "fourty two"
306
-QString checkWGamma(unsigned int n);
307
-
308
-/// \fn checkWDelta
309
-/// \~English
310
-/// \brief Given a unsigned integer returns its value as a string of words (in English)
311
-/// \param n the unsigned integer, e.g. 42
312
-/// \return QString containing the value (in words), e.g. "fourty two"
313
-/// \~Spanish
314
-/// \brief Dado un entero sin signo devuelve su valor como un string de palabras (in English)
315
-/// \param n el entero sin signo, e.g. 42
316
-/// \return QString que contien el valor en palabras, e.g. "fourty two"
317
-QString checkWDelta(unsigned int n);
26
+QString checkWAlpha(int n);
27
+QString checkWBeta(int n);
28
+QString checkWGamma(int n);
29
+QString checkWDelta(int n);
318
 
30
 
319
 #endif // FUNCTIONS_H
31
 #endif // FUNCTIONS_H

+ 0
- 1
images.qrc View File

6
         <file>resources/d4.png</file>
6
         <file>resources/d4.png</file>
7
         <file>resources/d5.png</file>
7
         <file>resources/d5.png</file>
8
         <file>resources/d6.png</file>
8
         <file>resources/d6.png</file>
9
-        <file>resources/logo.png</file>
10
     </qresource>
9
     </qresource>
11
 </RCC>
10
 </RCC>

BIN
imagesTesting.zip View File


+ 48
- 1
main.cpp View File

6
 #include <cassert>
6
 #include <cassert>
7
 #include <QDebug>
7
 #include <QDebug>
8
 
8
 
9
+void testSort() {
10
+    QString a = "AAA" , b = "BBB" , c = "CCC";
11
+    mySortBeta(a,b,c);
12
+    assert( a < b && b < c);
9
 
13
 
14
+    a = "AAA", b = "CCC", c = "BBB";
15
+    mySortBeta(a,b,c);
16
+    assert( a < b && b < c);
17
+
18
+    a = "BBB", b = "AAA", c = "CCC";
19
+    mySortBeta(a,b,c);
20
+    assert( a < b && b < c);
21
+
22
+    a = "BBB", b = "CCC", c = "AAA";
23
+    mySortBeta(a,b,c);
24
+    assert( a < b && b < c);
25
+
26
+    a = "CCC", b = "AAA", c = "BBB";
27
+    mySortBeta(a,b,c);
28
+    //qDebug() << a << b << c;
29
+    assert( a < b && b < c);
30
+
31
+    a = "CCC", b = "BBB", c = "AAA";
32
+    mySortBeta(a,b,c);
33
+    assert( a < b && b < c);
34
+
35
+    qDebug() << "Passed Test for Sort!!!!";
36
+}
37
+
38
+void testCheck() {
39
+
40
+    assert( checkWAlpha(91) == QString("ninety one"));
41
+    assert( checkWAlpha(891) == QString("eight hundred ninety one"));
42
+    assert( checkWAlpha(100) == QString("one hundred"));
43
+    assert( checkWAlpha(59123) == QString("fifty nine thousand one hundred twenty three"));
44
+    assert( checkWAlpha(100001) == QString("one hundred thousand one"));
45
+    assert( checkWAlpha(100000) == QString("one hundred thousand"));
46
+    assert( checkWAlpha(100000000) == QString("one hundred million"));
47
+    qDebug() << "Passed Test for Check Word!!!!";
48
+}
10
 
49
 
11
 int main(int argc, char *argv[])
50
 int main(int argc, char *argv[])
12
 {
51
 {
52
+//    testSort();
53
+    initCheckWMaps(); /*** DONT FORGET ***/
54
+
55
+//    testCheck();
56
+//    qDebug() << checkWAlpha(91);
57
+//    qDebug() << checkWAlpha(891);
58
+//    qDebug() << checkWAlpha(801);
13
 
59
 
14
-    initCheckWMaps(); 
15
 
60
 
16
     srand(time(NULL));
61
     srand(time(NULL));
17
     QApplication a(argc, argv);
62
     QApplication a(argc, argv);
18
     MainWindow w;
63
     MainWindow w;
19
     w.show();
64
     w.show();
20
 
65
 
66
+
67
+
21
     return a.exec();
68
     return a.exec();
22
 }
69
 }

+ 278
- 57
mainwindow.cpp View File

6
 #include "secondwindow.cpp"
6
 #include "secondwindow.cpp"
7
 
7
 
8
 #include <QDebug>
8
 #include <QDebug>
9
-#include <QTimer>
10
 #include <QtCore/qmath.h>
9
 #include <QtCore/qmath.h>
11
 #include <QMessageBox>
10
 #include <QMessageBox>
12
 #include "functions.h"
11
 #include "functions.h"
42
 
41
 
43
     // We need to know whenever the second window is closed to show the
42
     // We need to know whenever the second window is closed to show the
44
     // main window, or to hide when the second one is showed
43
     // main window, or to hide when the second one is showed
45
-    connect(window, SIGNAL(closeIt(bool)), this, SLOT(showMW(bool)));
44
+    connect(window, SIGNAL(cerrado(bool)), this, SLOT(mostrar(bool)));
46
 
45
 
47
     if(!dice1.load(":/images/resources/d1.png") || !dice2.load(":/images/resources/d1.png")){
46
     if(!dice1.load(":/images/resources/d1.png") || !dice2.load(":/images/resources/d1.png")){
48
         qDebug() << "Error1 Loading image";
47
         qDebug() << "Error1 Loading image";
56
     delete ui;
55
     delete ui;
57
 }
56
 }
58
 
57
 
59
-void MainWindow::showMW(bool doShow){
60
-    if (doShow){
58
+//This function show the main window and delete all the items created on the closed one or hide the mainwindow
59
+void MainWindow::mostrar(bool si){
60
+    if (si==true){
61
         show();
61
         show();
62
 
62
 
63
         // Deleting pointers and point them to NULL
63
         // Deleting pointers and point them to NULL
79
 
79
 
80
         // Create the new window and connecting it again with the signal
80
         // Create the new window and connecting it again with the signal
81
         window = new secondwindow;
81
         window = new secondwindow;
82
-        connect(window, SIGNAL(closeIt(bool)), this, SLOT(showMW(bool)));
82
+        connect(window, SIGNAL(cerrado(bool)), this, SLOT(mostrar(bool)));
83
     }
83
     }
84
     else hide();
84
     else hide();
85
 }
85
 }
86
 
86
 
87
-
88
-void MainWindow::setOption(QString str){
87
+//It is a slot that reads what item of the combo box was selected and save it
88
+//into a member
89
+void MainWindow::whatOption(QString str){
89
     option = str;
90
     option = str;
90
 }
91
 }
91
 
92
 
99
     score1 = score2 = 0;
100
     score1 = score2 = 0;
100
 }
101
 }
101
 
102
 
103
+//It forces the input 1 to be valid
104
+void MainWindow::RPSnormalizer1(QString str){
105
+    //For every character in the string only allow
106
+    //the character 'R' for rock, 'P' for paper and
107
+    //'S' for scissors. Delete all the other characters
108
+    //different from this three, and if is 'r', 'p' or 's'
109
+    //make it uppercase.
110
+    for (int i = 0; i< str.size(); i++){
111
+        if      (str[i] == 'r'){
112
+            str[i] = 'R';
113
+        }
114
+        else if (str[i] == 'p'){
115
+            str[i] = 'P';
116
+        }
117
+        else if (str[i] == 's'){
118
+            str[i] = 'S';
119
+        }
120
+
121
+        else if (str[i] == 'R' || str[i] == 'P' ||
122
+                 str[i] == 'S');//then its ok, do nothing
123
+        else{
124
+            str = str.mid(0,i).append(str.mid(i+1));
125
+        }
126
+    }
127
+
128
+    line[0]->setText(str);
129
+}
130
+
131
+//It forces the input 2 to be valid
132
+void MainWindow::RPSnormalizer2(QString str){
133
+    for (int i = 0; i< str.size(); i++){
134
+        if      (str[i] == 'r'){
135
+            str[i] = 'R';
136
+        }
137
+        else if (str[i] == 'p'){
138
+            str[i] = 'P';
139
+        }
140
+        else if (str[i] == 's'){
141
+            str[i] = 'S';
142
+        }
143
+        else if (str[i] == 'R' || str[i] == 'P' ||
144
+                 str[i] == 'S');//then its ok, do nothing
145
+        else{
146
+            str = str.mid(0,i).append(str.mid(i+1));
147
+        }
148
+    }
149
+
150
+    line[1]->setText(str);
151
+}
152
+
153
+//It forces the input 3 to be valid
154
+void MainWindow::RPSnormalizer3(QString str){
155
+    //Verify that the string do not contains other thing than
156
+    //numbers
157
+    for (int i = 0; i< str.size(); i++){
158
+        if (!str[i].isDigit()){
159
+            str = str.mid(0,i).append(str.mid(i+1));
160
+        }
161
+    }
162
+
163
+    //Left zeros do not count, delete them
164
+    while (str[0] == '0'){
165
+        str = str.mid(1);
166
+    }
167
+
168
+    //If the player exagerates the number of games to win
169
+    //change the string to the maximum number allowed
170
+    if (str.toInt() > 150){
171
+        str = "150";
172
+    }
173
+
174
+    line[2]->setText(str);
175
+}
176
+
177
+//It forces the input to be valid
178
+void MainWindow::CheckWnormalizer(QString str){
179
+    //Just allow numbers
180
+    for (int i = 0; i< str.size(); i++){
181
+        if (!str[i].isDigit()){
182
+            str = str.mid(0,i).append(str.mid(i+1));
183
+        }
184
+    }
185
+
186
+    //Zeros on the left side do not count (delete them)
187
+    while (str[0] == '0'){
188
+        str = str.mid(1);
189
+    }
190
+
191
+    //The maximum is 999,999,999
192
+    if (str.toDouble() > 999999999){
193
+        str = "999999999";
194
+    }
195
+
196
+    line[0]->setText(str);
197
+}
198
+
199
+
200
+
201
+//It forces the first input of Zulu to be valid
202
+void MainWindow::Zulunormalizer1(QString str){
203
+    //Just allow numbers to be written
204
+    for (int i = 0; i< str.size(); i++){
205
+        if (!str[i].isDigit()){
206
+            str = str.mid(0,i).append(str.mid(i+1));
207
+        }
208
+    }
209
+
210
+    //The maximum here is 2359, so force it to be the
211
+    //maximum when the user write a larger number
212
+    if (str.toInt() > 2359){
213
+        str = "2359";
214
+    }
215
+
216
+    line[0]->setText(str);
217
+}
218
+
219
+//It forces the second input of Zulu to be valid
220
+void MainWindow::Zulunormalizer2(QString str){
221
+    //Just allow one character to be written
222
+    if (str.size() > 1){
223
+        str = str[1];
224
+    }
225
+
226
+    //If that only character is 'e', 'c', 'm' or 'p'
227
+    //the uppercase it
228
+    if (str[0] == 'e' || str[0] == 'c' ||
229
+            str[0] == 'm' || str[0] == 'p'){
230
+        str = str[0].toUpper();
231
+    }
232
+    //If we get here is because the character is not
233
+    //the lowercase letters allowed... so if they are
234
+    //not the uppercase letters that we admit we have
235
+    //to delete it.
236
+    else if (str[0] != 'E' || str[0] != 'C' ||
237
+             str[0] != 'M' || str[0] != 'P'){
238
+        str = "";
239
+    }
240
+
241
+    line[1]->setText(str);
242
+}
243
+
244
+//It forces the first input of APFT to be valid
245
+void MainWindow::APFTnormalizer1(QString str){
246
+    //Just admit numbers, delete the other type of
247
+    //characters
248
+    for (int i = 0; i< str.size(); i++){
249
+        if (!str[i].isDigit()){
250
+            str = str.mid(0,i).append(str.mid(i+1));
251
+        }
252
+    }
253
+
254
+    //Left zeros are not valid
255
+    while (str[0] == '0'){
256
+        str = str.mid(1);
257
+    }
258
+
259
+    line[0]->setText(str);
260
+}
261
+
262
+//It forces the second input of APFT to be valid
263
+void MainWindow::APFTnormalizer2(QString str){
264
+    //Just allow the numbers to be written
265
+    for (int i = 0; i< str.size(); i++){
266
+        if (!str[i].isDigit()){
267
+            str = str.mid(0,i).append(str.mid(i+1));
268
+        }
269
+    }
270
+
271
+    //Left-hand zeros? Delete them
272
+    while (str[0] == '0'){
273
+        str = str.mid(1);
274
+    }
275
+
276
+    line[1]->setText(str);
277
+}
278
+
279
+//It forces the third input of APFT to be valid
280
+void MainWindow::APFTnormalizer3(QString str){
281
+    //Allow just numbers on the string only if the
282
+    //character is not in the position 2
283
+    for (int i = 0; i< str.size(); i++){
284
+        if (!str[i].isDigit() && i != 2){
285
+            str = str.mid(0,i).append(str.mid(i+1));
286
+        }
287
+    }
288
+
289
+    //Then if there is a character in the position 2
290
+    //and it is not ':', then add it between the
291
+    //position 1 and 3
292
+    if (str.size() > 2 && str[2] != ':'){
293
+        while (str.size()>2 && !str[2].isDigit()){
294
+            str = str.mid(0,2).append(str.mid(3));
295
+        }
296
+        str = str.mid(0, 2).append(':').append(str.mid(2));
297
+    }
298
+    //If the size exceeds 5, then take the first five
299
+    //so then we will have the format mm:ss
300
+    if (str.size() > 5){
301
+        str = str.mid(0, 5);
302
+    }
102
 
303
 
103
-void MainWindow::callOneOfTheSorts(){
304
+    line[2]->setText(str);
305
+}
306
+
307
+//Checks which version of sort is selected and call it
308
+void MainWindow::sorts(){
104
     QString a = line[0]->text();
309
     QString a = line[0]->text();
105
     QString b = line[1]->text();
310
     QString b = line[1]->text();
106
     QString c = line[2]->text();
311
     QString c = line[2]->text();
129
 }
334
 }
130
 
335
 
131
 
336
 
132
-void MainWindow::callOneOfTheRPS(){
337
+
338
+
339
+//Checks which version of RPS is selected and call it
340
+void MainWindow::RPSs(){
133
 
341
 
134
     QString p1 = this->cmbPlayer01->currentText();
342
     QString p1 = this->cmbPlayer01->currentText();
135
     QString p2 = this->cmbPlayer02->currentText();
343
     QString p2 = this->cmbPlayer02->currentText();
152
 
360
 
153
     QString st;
361
     QString st;
154
 
362
 
363
+    qDebug() << winnerNum;
155
 
364
 
156
     switch(winnerNum) {
365
     switch(winnerNum) {
157
         case 1:  st = "Player 1"; break;
366
         case 1:  st = "Player 1"; break;
162
 
371
 
163
     line[0]->setText(st);
372
     line[0]->setText(st);
164
 
373
 
374
+
375
+
165
 }
376
 }
166
 
377
 
378
+#include <QTimer>
167
 
379
 
168
 void MainWindow::paintDice() {
380
 void MainWindow::paintDice() {
169
-    this->timerCounter++;
381
+    qDebug() << this->timerCounter++;
170
     int a, b;
382
     int a, b;
171
     a = rand()%6;
383
     a = rand()%6;
172
     b = rand()%6;
384
     b = rand()%6;
187
     }
399
     }
188
 }
400
 }
189
 
401
 
402
+//Checks which version of dice is selected and call it
403
+void MainWindow::dices(){
404
+    // [rafa] Voy a hacer la animación aqui
405
+
190
 
406
 
191
-void MainWindow::callOneOfTheDices(){
192
 
407
 
193
     for (int i = 1; i <= 6; i++)
408
     for (int i = 1; i <= 6; i++)
194
         this->diceImages.push_back(QImage(":/images/resources/d" + QString::number(i) + ".png"));
409
         this->diceImages.push_back(QImage(":/images/resources/d" + QString::number(i) + ".png"));
195
 
410
 
411
+
196
     aTimer = new QTimer;
412
     aTimer = new QTimer;
197
     aTimer->setInterval(100);
413
     aTimer->setInterval(100);
198
     aTimer->setSingleShot(false);
414
     aTimer->setSingleShot(false);
204
 }
420
 }
205
 
421
 
206
 
422
 
207
-
208
-
209
-//========================================================
210
-// Functions for the dice roller
211
-//========================================================
212
-
213
-
214
-void MainWindow::diceAlpha(){
215
-    int total = diceFinal01 + diceFinal02 + 2;
216
-    line[0]->setText(QString::number(total));
217
-}
218
-
219
-
220
-void MainWindow::diceBeta(){
221
-    int total = diceFinal01 + diceFinal01 + 2;
222
-    line[0]->setText(QString::number(total));
223
-}
224
-
225
-
226
-void MainWindow::diceGamma(){
227
-    int total = diceFinal01 - diceFinal02;
228
-    line[0]->setText(QString::number(total));
229
-}
230
-
231
-
232
-void MainWindow::diceDelta(){
233
-    int total = diceFinal01 + diceFinal02;
234
-    line[0]->setText(QString::number(total));
235
-}
236
-
237
-
238
-void MainWindow::callOneOfTheChecks(){
423
+//Checks which version of check-writer is selected and call it
424
+void MainWindow::checkWs(){
239
     unsigned int qty;
425
     unsigned int qty;
240
     if (!validateCheckQty(line[0]->text(),qty)) {
426
     if (!validateCheckQty(line[0]->text(),qty)) {
241
         QMessageBox::warning(this, "Alert",
427
         QMessageBox::warning(this, "Alert",
252
         line[1]->setText( checkWDelta(qty) );
438
         line[1]->setText( checkWDelta(qty) );
253
 }
439
 }
254
 
440
 
255
-void MainWindow::callOneOfTheZulus(){
441
+//Checks which version of zulu is selected and call it
442
+void MainWindow::zulus(){
256
     QString zuluTime = line[0]->text();
443
     QString zuluTime = line[0]->text();
257
     QString zuluZone = line[1]->text();
444
     QString zuluZone = line[1]->text();
258
     int hours, minutes;
445
     int hours, minutes;
260
     if (!validZuluTime(zuluTime, zuluZone, hours, minutes) ) {
447
     if (!validZuluTime(zuluTime, zuluZone, hours, minutes) ) {
261
 
448
 
262
         QMessageBox::warning(this, "Alert",
449
         QMessageBox::warning(this, "Alert",
263
-                             "Either Zulu Time or Zone is not valid.");
450
+                             "Either Zulu Time or Zone is not valid");
264
         line[2]->setText("Error");
451
         line[2]->setText("Error");
265
         return;
452
         return;
266
     }
453
     }
275
 
462
 
276
 }
463
 }
277
 
464
 
465
+//Checks which version of APFT is selected and call it
466
+void MainWindow::APFTs(){
467
+    if (option == "Version Alpha"){
468
+        APFTAlpha();
469
+    }
470
+    else if (option == "Version Beta"){
471
+        APFTBeta();
472
+    }
473
+    else if (option == "Version Gamma"){
474
+        APFTGamma();
475
+    }
476
+    else{
477
+        APFTDelta();
478
+    }
479
+}
278
 
480
 
481
+//Here is what happend when Sort-button is clicked
279
 void MainWindow::on_SortsButton_clicked()
482
 void MainWindow::on_SortsButton_clicked()
280
 {
483
 {
281
     //Create a new QComboBox and add the items in it
484
     //Create a new QComboBox and add the items in it
322
 
525
 
323
     //Here we connect the signals of the widgets generated
526
     //Here we connect the signals of the widgets generated
324
     //by code to their respective functions
527
     //by code to their respective functions
325
-    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(setOption(QString)));
326
-    connect(button[0], SIGNAL(clicked()), this, SLOT(callOneOfTheSorts()));
528
+    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(whatOption(QString)));
529
+    connect(button[0], SIGNAL(clicked()), this, SLOT(sorts()));
327
     connect(button[1], SIGNAL(clicked()), this, SLOT(clearLines()));
530
     connect(button[1], SIGNAL(clicked()), this, SLOT(clearLines()));
328
 
531
 
329
     //Now that we have set our new window, we hide the main-window
532
     //Now that we have set our new window, we hide the main-window
330
     //and show the new one. The new-window has a signal that
533
     //and show the new one. The new-window has a signal that
331
     //notify when it was closed so we can shor the main-window
534
     //notify when it was closed so we can shor the main-window
332
     window->setLayout(layout);
535
     window->setLayout(layout);
333
-    showMW(false);
536
+    mostrar(false);
334
     window->show();
537
     window->show();
335
 }
538
 }
336
 
539
 
540
+//Here is what happend when Dice-button is clicked
337
 void MainWindow::on_DiceButton_clicked()
541
 void MainWindow::on_DiceButton_clicked()
338
 {
542
 {
339
     //Create a new QComboBox and add the items in it
543
     //Create a new QComboBox and add the items in it
377
 
581
 
378
     //Here we connect the signals of the widgets generated
582
     //Here we connect the signals of the widgets generated
379
     //by code to their respective functions
583
     //by code to their respective functions
380
-    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(setOption(QString)));
381
-    connect(button[0], SIGNAL(clicked()), this, SLOT(callOneOfTheDices()));
584
+    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(whatOption(QString)));
585
+    connect(button[0], SIGNAL(clicked()), this, SLOT(dices()));
382
 
586
 
383
     //Now that we have set our new window, we hide the main-window
587
     //Now that we have set our new window, we hide the main-window
384
     //and show the new one. The new-window has a signal that
588
     //and show the new one. The new-window has a signal that
385
     //notify when it was closed so we can shor the main-window
589
     //notify when it was closed so we can shor the main-window
386
     window->setLayout(layout);
590
     window->setLayout(layout);
387
-    showMW(false);
591
+    mostrar(false);
388
     window->show();
592
     window->show();
389
 }
593
 }
390
 
594
 
595
+//Here is what happend when RPS-button is clicked
391
 void MainWindow::on_RPSButton_clicked()
596
 void MainWindow::on_RPSButton_clicked()
392
 {
597
 {
393
     //Create a new QComboBox and add the items in it
598
     //Create a new QComboBox and add the items in it
405
     cmbPlayer01->addItem("scisors");    cmbPlayer02->addItem("scisors");
610
     cmbPlayer01->addItem("scisors");    cmbPlayer02->addItem("scisors");
406
 
611
 
407
 
612
 
613
+
614
+
615
+
408
     //The buttons needed here are the 'play' and 'clear' buttons
616
     //The buttons needed here are the 'play' and 'clear' buttons
409
     button[0] = new QPushButton("Play");
617
     button[0] = new QPushButton("Play");
618
+//    button[1] = new QPushButton("Clear");
410
 
619
 
620
+    //3 inputs and 1 output
621
+//    for (int i = 0; i<4; i++){
622
+//        line[i] = new QLineEdit;
623
+//    }
411
     line[0] = new QLineEdit;
624
     line[0] = new QLineEdit;
412
     //The user is not able to write on the output line
625
     //The user is not able to write on the output line
413
     line[0]->setEnabled(false);
626
     line[0]->setEnabled(false);
415
     //Labels to let the user understand the app
628
     //Labels to let the user understand the app
416
     label[0] = new QLabel("Player 1's moves");
629
     label[0] = new QLabel("Player 1's moves");
417
     label[1] = new QLabel("Player 2's moves");
630
     label[1] = new QLabel("Player 2's moves");
631
+//    label[2] = new QLabel("How many games to win:");
418
     label[2] = new QLabel("Winner:");
632
     label[2] = new QLabel("Winner:");
633
+//    label[4] = new QLabel("Tournament:");
634
+//    //lines for score
635
+//    line[4] = new QLineEdit;
636
+//    line[4]->setEnabled(false);
637
+
419
 
638
 
420
     //We create a new layout and insert the comboBox to it
639
     //We create a new layout and insert the comboBox to it
421
     int row = 0;
640
     int row = 0;
432
 
651
 
433
     //Here we connect the signals of the widgets generated
652
     //Here we connect the signals of the widgets generated
434
     //by code to their respective functions
653
     //by code to their respective functions
435
-    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(setOption(QString)));
436
-    connect(button[0], SIGNAL(clicked()), this, SLOT(callOneOfTheRPS()));
654
+    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(whatOption(QString)));
655
+    connect(button[0], SIGNAL(clicked()), this, SLOT(RPSs()));
437
 
656
 
438
     //Now that we have set our new window, we hide the main-window
657
     //Now that we have set our new window, we hide the main-window
439
     //and show the new one. The new-window has a signal that
658
     //and show the new one. The new-window has a signal that
440
     //notify when it was closed so we can shor the main-window
659
     //notify when it was closed so we can shor the main-window
441
     window->setLayout(layout);
660
     window->setLayout(layout);
442
-    showMW(false);
661
+    mostrar(false);
443
     window->show();
662
     window->show();
663
+//    score1 = score2 = 0;
444
 }
664
 }
445
 
665
 
446
 
666
 
667
+
668
+//Here is what happend when Zulu-button is clicked
447
 void MainWindow::on_ZuluButton_clicked()
669
 void MainWindow::on_ZuluButton_clicked()
448
 {
670
 {
449
     //Create a new QComboBox and add the items in it
671
     //Create a new QComboBox and add the items in it
487
 
709
 
488
     //Here we connect the signals of the widgets generated
710
     //Here we connect the signals of the widgets generated
489
     //by code to their respective functions
711
     //by code to their respective functions
490
-    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(setOption(QString)));
712
+    connect(method, SIGNAL(currentIndexChanged(QString)), this, SLOT(whatOption(QString)));
491
     connect(button[0], SIGNAL(clicked()), this, SLOT(clearLines()));
713
     connect(button[0], SIGNAL(clicked()), this, SLOT(clearLines()));
492
-    connect(button[1], SIGNAL(clicked()), this, SLOT(callOneOfTheZulus()));
714
+    connect(button[1], SIGNAL(clicked()), this, SLOT(zulus()));
493
 
715
 
494
     // Rafa 2014-09-16 - Validation will be done when button is clicked
716
     // Rafa 2014-09-16 - Validation will be done when button is clicked
495
     //    connect(line[0], SIGNAL(textEdited(QString)), this, SLOT(Zulunormalizer1(QString)));
717
     //    connect(line[0], SIGNAL(textEdited(QString)), this, SLOT(Zulunormalizer1(QString)));
499
     //and show the new one. The new-window has a signal that
721
     //and show the new one. The new-window has a signal that
500
     //notify when it was closed so we can shor the main-window
722
     //notify when it was closed so we can shor the main-window
501
     window->setLayout(layout);
723
     window->setLayout(layout);
502
-    showMW(false);
503
     window->show();
724
     window->show();
504
 }
725
 }
505
 
726
 

+ 45
- 152
mainwindow.h View File

28
     explicit MainWindow(QWidget *parent = 0);
28
     explicit MainWindow(QWidget *parent = 0);
29
     ~MainWindow();
29
     ~MainWindow();
30
 
30
 
31
-
32
-    /// \fn diceAlpha
33
-    /// \~English
34
-    /// \brief Computes the dice total based on the values of the dice.
35
-    /// \~Spanish
36
-    /// \brief Computa el total de puntos usando los valores de los dados.
37
     void diceAlpha();
31
     void diceAlpha();
38
-
39
-
40
-    /// \fn diceBeta
41
-    /// \~English
42
-    /// \brief Computes the dice total based on the values of the dice.
43
-    /// \~Spanish
44
-    /// \brief Computa el total de puntos usando los valores de los dados.
45
     void diceBeta();
32
     void diceBeta();
46
-
47
-    /// \fn diceGamma
48
-    /// \~English
49
-    /// \brief Computes the dice total based on the values of the dice.
50
-    /// \~Spanish
51
-    /// \brief Computa el total de puntos usando los valores de los dados.
52
     void diceGamma();
33
     void diceGamma();
53
-
54
-    /// \fn diceDelta
55
-    /// \~English
56
-    /// \brief Computes the dice total based on the values of the dice.
57
-    /// \~Spanish
58
-    /// \brief Computa el total de puntos usando los valores de los dados.
59
     void diceDelta();
34
     void diceDelta();
60
 
35
 
36
+    void APFTAlpha();
37
+    void APFTBeta();
38
+    void APFTGamma();
39
+    void APFTDelta();
61
 
40
 
62
 private slots:
41
 private slots:
63
-
64
-
65
-    /// \fn on_SortsButton_clicked
66
-    /// \~English
67
-    /// \brief Called when Sort-button is clicked. Creates controls for secondary window,
68
-    /// displays it, and hides the main window.
69
-    /// \~Spanish
70
-    /// \brief Esta función es llamada cuando el usuario cliquea el boton de Sort. 
71
-    /// Crea los controles de la ventana secundaria. muestra la ventana secundaria 
72
-    /// y esconde la ventana principal.
73
     void on_SortsButton_clicked();
42
     void on_SortsButton_clicked();
74
-
75
-    /// \fn on_DiceButton_clicked
76
-    /// \~English
77
-    /// \brief Called when Dice button is clicked. Creates controls for secondary window,
78
-    /// displays it, and hides the main window.
79
-    /// \~Spanish
80
-    /// \brief Esta función es llamada cuando el usuario cliquea el boton de Dice. 
81
-    /// Crea los controles de la ventana secundaria. muestra la ventana secundaria 
82
-    /// y esconde la ventana principal.
83
     void on_DiceButton_clicked();
43
     void on_DiceButton_clicked();
84
-
85
-    /// \fn on_RPSButton_clicked
86
-    /// \~English
87
-    /// \brief Called when RPS button is clicked. Creates controls for secondary window,
88
-    /// displays it, and hides the main window.
89
-    /// \~Spanish
90
-    /// \brief Esta función es llamada cuando el usuario cliquea el boton de RPS. 
91
-    /// Crea los controles de la ventana secundaria. muestra la ventana secundaria 
92
-    /// y esconde la ventana principal.  
93
     void on_RPSButton_clicked();
44
     void on_RPSButton_clicked();
45
+    void on_ZuluButton_clicked();
94
 
46
 
47
+    void mostrar(bool si);
95
 
48
 
96
-    /// \fn on_ZuluButton_clicked
97
-    /// \~English
98
-    /// \brief Called when Zulu time button is clicked. Creates controls for secondary window,
99
-    /// displays it, and hides the main window.
100
-    /// \~Spanish
101
-    /// \brief Esta función es llamada cuando el usuario cliquea el boton de Zulu time. 
102
-    /// Crea los controles de la ventana secundaria. muestra la ventana secundaria 
103
-    /// y esconde la ventana principal.  
104
-    void on_ZuluButton_clicked();
49
+    void whatOption(QString str);
105
 
50
 
106
-    /// \fn showMW
107
-    /// \~English
108
-    /// \brief This function either (1) shows the main window and deletes all the items created on 
109
-    /// the closed one or (2) hides the mainwindow
110
-    /// \param doShow if true then show the main window, else hide it. 
111
-    /// \~Spanish
112
-    /// \brief Esta función hace una de dos: (1) muestra la ventana principal y borra
113
-    /// todas los elementos creados en la secundaria, o (2) esconde la ventana principal
114
-    /// \param doShow si es true muestra la ventana principal, de lo contrario la esconde. 
115
-    void showMW(bool doShow);
116
-
117
-
118
-    /// \fn setOption
119
-    /// \~English
120
-    /// \brief A slot that reads what item of the combo box was selected and saves it
121
-    /// to a data member.
122
-    /// \~Spanish
123
-    /// \brief Un slot que lee la selección del combobox y lo guarda a un data member.
124
-    void setOption(QString str);
125
-
126
-
127
-    /// \fn clearLines
128
-    /// \~English
129
-    /// \brief Clear the text boxes in the GUIs.
130
-    /// \~Spanish
131
-    /// \brief Limpia las cajas de texto en los GUIs.
132
     void clearLines();
51
     void clearLines();
133
 
52
 
134
-    /// \fn callOneOfTheSorts
135
-    /// \~English
136
-    /// \brief Reads the version combobox, validates the inputs, and calls the
137
-    /// alpha, beta, gamma or delta sort function.
138
-    /// \~Spanish
139
-    /// \brief Lee el combobox, valida los inputs y llama a la versión
140
-    /// alpha, beta, gamma o delta de las funciones de sort
141
-    void callOneOfTheSorts();
142
-
143
-
144
-    /// \fn callOneOfTheRPS
145
-    /// \~English
146
-    /// \brief Reads the version combobox, validates the inputs, and calls the
147
-    /// alpha, beta, gamma or delta RPS function.
148
-    /// \~Spanish
149
-    /// \brief Lee el combobox, valida los inputs y llama a la versión
150
-    /// alpha, beta, gamma o delta de las funciones de RPS (piedra, papel y tijera)
151
-    void callOneOfTheRPS();
152
-
153
-
154
-    /// \fn callOneOfTheDices
155
-    /// \~English
156
-    /// \brief Reads the version combobox, validates the inputs, and calls the
157
-    /// alpha, beta, gamma or delta dice function.
158
-    /// \~Spanish
159
-    /// \brief Lee el combobox, valida los inputs y llama a la versión
160
-    /// alpha, beta, gamma o delta de las funciones de "dice".
161
-    void callOneOfTheDices();
162
-
163
-
164
-    /// \fn callOneOfTheChecks
165
-    /// \~English
166
-    /// \brief Reads the version combobox, validates the inputs, and calls the
167
-    /// alpha, beta, gamma or delta check function
168
-    /// \~Spanish
169
-    /// \brief Lee el combobox, valida los inputs y llama a la versión
170
-    /// alpha, beta, gamma o delta de las funciones de cheques.
171
-    void callOneOfTheChecks();
172
-
173
-
174
-    /// \fn callOneOfTheZulus
175
-    /// \~English
176
-    /// \brief Reads the version combobox, validates the inputs, and calls the
177
-    /// alpha, beta, gamma or delta zulu time function
178
-    /// \~Spanish
179
-    /// \brief Lee el combobox, valida los inputs y llama a la versión
180
-    /// alpha, beta, gamma o delta de las funciones de zulu time.
181
-    void callOneOfTheZulus();
182
-
183
-
184
-    /// \fn paintDice
185
-    /// \~English
186
-    /// \brief This function is called on every timer tick to "animate" the dice.
187
-    /// \~Spanish
188
-    /// \brief Función invocada en cada tick del timer para "animar" el dado.
53
+    void RPSnormalizer1(QString str);
54
+
55
+    void RPSnormalizer2(QString str);
56
+
57
+    void RPSnormalizer3(QString str);
58
+
59
+    void CheckWnormalizer(QString str);
60
+
61
+    void Zulunormalizer1(QString str);
62
+
63
+    void Zulunormalizer2(QString str);
64
+
65
+    void APFTnormalizer1(QString str);
66
+
67
+    void APFTnormalizer2(QString str);
68
+
69
+    void APFTnormalizer3(QString str);
70
+
71
+    void sorts();
72
+
73
+    void RPSs();
74
+
75
+    void dices();
76
+
77
+    void checkWs();
78
+
79
+    void zulus();
80
+
81
+    void APFTs();
82
+
189
     void paintDice();
83
     void paintDice();
190
 
84
 
191
 private:
85
 private:
192
-    Ui::MainWindow  *ui;
193
-    secondwindow    *window;
194
-    QGridLayout     *layout;
195
-    QPushButton     *button[2];
196
-    QLineEdit       *line[7];
197
-    QLabel          *label[7];
198
-    QComboBox       *method, *cmbPlayer01, *cmbPlayer02;
199
-    QTimer          *aTimer;
200
-
86
+    Ui::MainWindow *ui;
87
+    secondwindow *window;
88
+    QGridLayout *layout;
89
+    QPushButton *button[2];
201
     int buttonSize;
90
     int buttonSize;
91
+    QLineEdit *line[7];
202
     int lineSize;
92
     int lineSize;
93
+    QLabel *label[7];
203
     int labelSize;
94
     int labelSize;
95
+    QComboBox *method, *cmbPlayer01, *cmbPlayer02;
204
     QString option;
96
     QString option;
205
     QImage dice1;
97
     QImage dice1;
206
     QImage dice2;
98
     QImage dice2;
207
     int diceFinal01, diceFinal02;
99
     int diceFinal01, diceFinal02;
100
+    QTimer *aTimer;
208
     int timerCounter;
101
     int timerCounter;
209
     int score1, score2;
102
     int score1, score2;
210
 
103
 

+ 4
- 3
mainwindow.ui View File

127
        <x>30</x>
127
        <x>30</x>
128
        <y>54</y>
128
        <y>54</y>
129
        <width>641</width>
129
        <width>641</width>
130
-       <height>16</height>
130
+       <height>4</height>
131
       </rect>
131
       </rect>
132
      </property>
132
      </property>
133
      <property name="styleSheet">
133
      <property name="styleSheet">
151
      </rect>
151
      </rect>
152
     </property>
152
     </property>
153
     <property name="styleSheet">
153
     <property name="styleSheet">
154
-     <string notr="true">background-image: url(:/images/resources/logo.png);</string>
154
+     <string notr="true">background-image: url(/home/rgb/Desktop/eip/CaesarCipher/logo.png);
155
+border: 0px;
156
+</string>
155
     </property>
157
     </property>
156
     <property name="frameShape">
158
     <property name="frameShape">
157
      <enum>QFrame::StyledPanel</enum>
159
      <enum>QFrame::StyledPanel</enum>
159
     <property name="frameShadow">
161
     <property name="frameShadow">
160
      <enum>QFrame::Raised</enum>
162
      <enum>QFrame::Raised</enum>
161
     </property>
163
     </property>
162
-    <zorder>label</zorder>
163
    </widget>
164
    </widget>
164
   </widget>
165
   </widget>
165
  </widget>
166
  </widget>

+ 1
- 1
secondwindow.cpp View File

7
 }
7
 }
8
 
8
 
9
 void secondwindow::closeEvent(QCloseEvent *){
9
 void secondwindow::closeEvent(QCloseEvent *){
10
-    emit closeIt(true);
10
+    emit cerrado(true);
11
 }
11
 }

+ 1
- 26
secondwindow.h View File

7
 {
7
 {
8
     Q_OBJECT
8
     Q_OBJECT
9
 public:
9
 public:
10
-
11
-    /// \fn secondwindow
12
-    /// \~English
13
-    /// \brief Constructor.
14
-    /// \param parent this object's parent
15
-    /// \~Spanish
16
-    /// \brief Constructor
17
-    /// \param parent ventana padre
18
     explicit secondwindow(QWidget *parent = 0);
10
     explicit secondwindow(QWidget *parent = 0);
19
 
11
 
20
 signals:
12
 signals:
21
-    /// \fn closeIt
22
-    /// \~English
23
-    /// \brief Just a signal that will be emitted when closing 
24
-	/// objects of this class
25
-	/// \param dummy this parameter is just for making this signal compatible with 
26
-    /// type of slot it will be connected.
27
-    /// \~Spanish
28
-    /// \brief Señal que será emitida al cerrar objetos de esta clase
29
-	/// \param dummy este parameterro existe para que la señal sea compatible con el
30
-	/// slot al que será conectada.
31
-    void closeIt(bool dummy);
13
+    void cerrado(bool si);
32
 
14
 
33
 protected:
15
 protected:
34
-
35
-    /// \fn closeEvent
36
-    /// \~English
37
-    /// \brief Overloaded function that is called when an object of this class is closed.
38
-    /// \~Spanish
39
-    /// \brief Función sobrecargada que es invocada cuando se cierra un objeto de 
40
-    /// esta clase.  
41
     virtual void closeEvent(QCloseEvent *);
16
     virtual void closeEvent(QCloseEvent *);
42
 
17
 
43
 public slots:
18
 public slots: