| # Copyright 2015 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Unit tests for StateChangeDetector.""" |
| |
| from optofidelity.detection import StateChangeDetector |
| from optofidelity.detection.events import StateChangeEvent, AnalogStateEvent |
| |
| from .test_detector import DetectorTest |
| |
| # PreProcess output recorded from example video |
| change_sequence_1 = [ |
| 0.00347824, 0.00130218, 0.00053278, 0.00056810, 0.00117425, 0.00336789, |
| 0.00127787, 0.00066483, 0.00067462, 0.00412031, 0.00455657, 0.00106703, |
| 0.00049847, 0.00048912, 0.00116794, 0.00349118, 0.00119340, 0.00093575, |
| 0.00100451, 0.00204483, 0.00279376, 0.00062749, 0.00057326, 0.00057242, |
| 0.00178059, 0.00303055, 0.00106795, 0.00096390, 0.00096042, 0.00189988, |
| 0.00274776, 0.00111085, 0.00065327, 0.00060079, 0.00203435, 0.00320078, |
| 0.00152150, 0.00043971, 0.00044425, 0.00207842, 0.00339199, 0.00107329, |
| 0.00050823, 0.00053363, 0.00240130, 0.00396788, 0.00119779, 0.00073012, |
| 0.00080402, 0.00203072, 0.00267047, 0.00119540, 0.00040585, 0.00041424, |
| 0.00122819, 0.00297391, 0.00184724, 0.00010041, 0.00016423, 0.00171512, |
| 0.00330200, 0.00081424, 0.00007995, 0.00001608, 0.00000000, 0.00317008, |
| 0.00094716, 0.00088354, 0.00086956, 0.00516213, 0.00547996, 0.00106640, |
| 0.00047504, 0.00049246, 0.00141369, 0.00264750, 0.00185916, 0.00079431, |
| 0.00078450, 0.00232153, 0.00293230, 0.00082235, 0.00065647, 0.00064123, |
| 0.00176944, 0.00305226, 0.00202612, 0.00102933, 0.00099799, 0.00174910, |
| 0.02593319, 0.05430637, 0.06744825, 0.08110544, 0.08721084, 0.09439866, |
| 0.09459204, 0.09416096, 0.09547736, 0.10331900, 0.10448187, 0.10101519, |
| 0.09788287, 0.09814493, 0.10332978, 0.11050909, 0.10520491, 0.10318538, |
| 0.10315405, 0.10806231, 0.10916179, 0.10476584, 0.10313421, 0.10348039, |
| 0.10723974, 0.10948376, 0.10469930, 0.10133333, 0.10156623, 0.10991812, |
| 0.10975871, 0.10454227, 0.10383158, 0.10364129, 0.10731385, 0.10927433, |
| 0.10559126, 0.10479777, 0.10499379, 0.11124797, 0.11142010, 0.10469314, |
| 0.10386540, 0.10383323, 0.10757521, 0.10945444, 0.10408906, 0.10290318, |
| 0.10290444, 0.10723487, 0.10839373, 0.09818906, 0.09806091, 0.09815092, |
| 0.10218275, 0.10036981, 0.09241706, 0.08973892, 0.09001418, 0.09544218, |
| 0.07454016, 0.02823926, 0.01445453, 0.00872970, 0.00909226, 0.00817691, |
| 0.00285339, 0.00225739, 0.00213303, 0.00294443, 0.00435523, 0.00156762, |
| 0.00074638, 0.00060085, 0.00206071, 0.00474998, 0.00111854, 0.00071442, |
| 0.00072192, 0.00245570, 0.00375909, 0.00091994, 0.00087931, 0.00089672, |
| 0.00203486, 0.00364873, 0.00190578, 0.00051891, 0.00053754, 0.00288633 |
| ] |
| |
| change_sequence_pwm = [ |
| 0.0045, 0.0094, 0.0122, 0.0033, 0.0044, 0.0046, 0.0086, 0.0106, 0.0025, |
| 0.0035, 0.0037, 0.0093, 0.0101, 0.0029, 0.0032, 0.0035, 0.0077, 0.0105, |
| 0.0032, 0.0019, 0.0032, 0.0087, 0.0117, 0.0037, 0.0034, 0.0037, 0.0081, |
| 0.0117, 0.0036, 0.0029, 0.0032, 0.0064, 0.0120, 0.0018, 0.0022, 0.0024, |
| 0.0065, 0.0103, 0.0025, 0.0028, 0.0027, 0.0057, 0.0119, 0.0023, 0.0016, |
| 0.0018, 0.0059, 0.0088, 0.0024, 0.0020, 0.0026, 0.0044, 0.0096, 0.0041, |
| 0.0017, 0.0026, 0.0044, 0.0124, 0.0055, 0.0020, 0.0034, 0.0044, 0.0090, |
| 0.0057, 0.0016, 0.0025, 0.0057, 0.0119, 0.0079, 0.0040, 0.0055, 0.0054, |
| 0.0111, 0.0079, 0.0045, 0.0045, 0.0049, 0.0104, 0.0059, 0.0018, 0.0024, |
| 0.0024, 0.0075, 0.0058, 0.0020, 0.0014, 0.0022, 0.0070, 0.0058, 0.0017, |
| 0.0021, 0.0033, 0.0097, 0.0116, 0.0038, 0.0040, 0.0042, 0.0102, 0.0110, |
| 0.0038, 0.0035, 0.0038, 0.0097, 0.0113, 0.0037, 0.0025, 0.0027, 0.0088, |
| 0.0103, 0.0033, 0.0028, 0.0032, 0.0082, 0.0109, 0.0011, 0.0010, 0.0017, |
| 0.0055, 0.0083, 0.0005, 0.0015, 0.0021, 0.0057, 0.0077, 0.0009, 0.0013, |
| 0.0017, 0.0061, 0.0111, 0.0016, 0.0022, 0.0023, 0.0062, 0.0094, 0.0023, |
| 0.0022, 0.0023, 0.0058, 0.0109, 0.0620, 0.1146, 0.1143, 0.1117, 0.1108, |
| 0.1125, 0.1220, 0.1215, 0.1186, 0.1176, 0.1164, 0.1225, 0.1223, 0.1199, |
| 0.1214, 0.1151, 0.1221, 0.1226, 0.1178, 0.1182, 0.1149, 0.1224, 0.1209, |
| 0.1216, 0.1204, 0.1189, 0.1254, 0.1235, 0.1229, 0.1218, 0.1178, 0.1261, |
| 0.1237, 0.1236, 0.1207, 0.1169, 0.1252, 0.1211, 0.1222, 0.1197, 0.1178, |
| 0.1241, 0.1211, 0.1217, 0.1209, 0.1202, 0.1248, 0.1221, 0.1220, 0.1204, |
| 0.1202, 0.1221, 0.1215, 0.1211, 0.1191, 0.1221, 0.1244, 0.1230, 0.1234, |
| 0.1227, 0.1215, 0.1230, 0.1225, 0.1234, 0.1214, 0.1212, 0.1176, 0.1196, |
| 0.1208, 0.1198, 0.1187, 0.1096, 0.1116, 0.1136, 0.1112, 0.1129, 0.0263, |
| 0.0084, 0.0098, 0.0172, 0.0179, 0.0041, 0.0027, 0.0040, 0.0041, 0.0114, |
| 0.0026, 0.0026, 0.0027, 0.0039, 0.0090, 0.0020, 0.0031, 0.0035, 0.0030, |
| 0.0088, 0.0030, 0.0020, 0.0026, 0.0026, 0.0068, 0.0056, 0.0023, 0.0027, |
| ] |
| |
| change_sequence_noisy = [ |
| 0.0111, 0.0118, 0.0105, 0.0084, 0.0074, 0.0126, 0.0140, 0.0098, 0.0081, |
| 0.0090, 0.0134, 0.0158, 0.0104, 0.0091, 0.0100, 0.0150, 0.0135, 0.0099, |
| 0.0106, 0.0096, 0.0145, 0.0150, 0.0099, 0.0087, 0.0097, 0.0141, 0.0140, |
| 0.0085, 0.0082, 0.0099, 0.0139, 0.0139, 0.0090, 0.0086, 0.0109, 0.0132, |
| 0.0126, 0.0082, 0.0089, 0.0106, 0.0156, 0.0141, 0.0088, 0.0095, 0.0108, |
| 0.0146, 0.0110, 0.0084, 0.0087, 0.0124, 0.0150, 0.0140, 0.0112, 0.0099, |
| 0.0122, 0.0153, 0.0102, 0.0086, 0.0099, 0.0143, 0.0150, 0.0120, 0.0113, |
| 0.0095, 0.0142, 0.0152, 0.0101, 0.0096, 0.0099, 0.0153, 0.0133, 0.0082, |
| 0.0080, 0.0114, 0.0161, 0.0153, 0.0115, 0.0082, 0.0117, 0.0140, 0.0128, |
| 0.0087, 0.0092, 0.0117, 0.0138, 0.0118, 0.0078, 0.0081, 0.0125, 0.0163, |
| 0.0125, 0.0095, 0.0086, 0.0119, 0.0138, 0.0107, 0.0096, 0.0099, 0.0162, |
| 0.0165, 0.0109, 0.0122, 0.0109, 0.0149, 0.0152, 0.0098, 0.0107, 0.0106, |
| 0.0152, 0.0126, 0.0093, 0.0126, 0.0119, 0.0174, 0.0133, 0.0358, 0.0327, |
| 0.0314, 0.0389, 0.0397, 0.0329, 0.0298, 0.0317, 0.0394, 0.0399, 0.0324, |
| 0.0281, 0.0319, 0.0399, 0.0373, 0.0329, 0.0280, 0.0332, 0.0393, 0.0345, |
| 0.0315, 0.0281, 0.0350, 0.0414, 0.0346, 0.0312, 0.0293, 0.0347, 0.0404, |
| 0.0326, 0.0305, 0.0284, 0.0358, 0.0386, 0.0311, 0.0342, 0.0280, 0.0362, |
| 0.0393, 0.0306, 0.0339, 0.0284, 0.0366, 0.0386, 0.0309, 0.0318, 0.0286, |
| 0.0381, 0.0400, 0.0302, 0.0297, 0.0308, 0.0388, 0.0379, 0.0288, 0.0286, |
| 0.0315, 0.0394, 0.0370, 0.0287, 0.0268, 0.0320, 0.0400, 0.0352, 0.0273, |
| 0.0262, 0.0359, 0.0423, 0.0354, 0.0319, 0.0288, 0.0369, 0.0426, 0.0345, |
| 0.0305, 0.0279, 0.0192, 0.0241, 0.0200, 0.0202, 0.0108, 0.0143, 0.0128, |
| 0.0089, 0.0097, 0.0095, 0.0141, 0.0150, 0.0114, 0.0090, 0.0103, 0.0131, |
| 0.0144, 0.0096, 0.0085, 0.0100, 0.0134, 0.0113, 0.0071, 0.0090, 0.0101, |
| 0.0139, 0.0119, 0.0088, 0.0083, 0.0113, 0.0142, 0.0105, 0.0075, 0.0101, |
| 0.0117, 0.0159, 0.0115, 0.0081, 0.0101, 0.0126, 0.0166, 0.0107, 0.0105, |
| 0.0109, 0.0149, 0.0137, 0.0097, 0.0099, 0.0112, 0.0144, 0.0122, 0.0087, |
| ] |
| |
| change_sequence_noisy2 = [ |
| 0.0688, 0.0682, 0.0693, 0.0479, 0.0645, 0.0631, 0.0608, 0.0628, 0.0486, |
| 0.0648, 0.0589, 0.0667, 0.0621, 0.0528, 0.0607, 0.0598, 0.0700, 0.0601, |
| 0.0611, 0.0655, 0.0652, 0.0700, 0.0559, 0.0609, 0.0660, 0.0667, 0.0719, |
| 0.0511, 0.0671, 0.0644, 0.0680, 0.0717, 0.0490, 0.0635, 0.0680, 0.0638, |
| 0.0703, 0.0469, 0.0644, 0.0644, 0.0821, 0.0795, 0.0949, 0.1106, 0.1189, |
| 0.1014, 0.0852, 0.1063, 0.0946, 0.1146, 0.0967, 0.0859, 0.1100, 0.1015, |
| 0.1096, 0.0909, 0.0856, 0.1122, 0.0986, 0.1055, 0.0895, 0.0869, 0.1121, |
| 0.0997, 0.1053, 0.0865, 0.0896, 0.1171, 0.1019, 0.1032, 0.0838, 0.0921, |
| 0.1175, 0.1134, 0.0978, 0.0807, 0.0973, 0.1193, 0.1171, 0.0970, 0.0808, |
| 0.1035, 0.1216, 0.1177, 0.0966, 0.0800, 0.1112, 0.1028, 0.1120, 0.0915, |
| 0.0805, 0.1153, 0.1011, 0.1096, 0.0896, 0.0822, 0.1207, 0.1001, 0.1064, |
| ] |
| |
| change_sequence_multilevel = [ |
| 0.0106, 0.0119, 0.0149, 0.0138, 0.0132, 0.0115, 0.0141, 0.0152, 0.0136, |
| 0.0129, 0.0116, 0.0142, 0.0152, 0.0136, 0.0121, 0.0113, 0.0134, 0.0132, |
| 0.0128, 0.0119, 0.0110, 0.0142, 0.0150, 0.0133, 0.0128, 0.0122, 0.0144, |
| 0.0127, 0.0138, 0.0150, 0.0123, 0.0145, 0.0126, 0.0124, 0.0131, 0.0144, |
| 0.0156, 0.0132, 0.0118, 0.0137, 0.0119, 0.0129, 0.0134, 0.0123, 0.0137, |
| 0.0154, 0.0142, 0.0147, 0.0142, 0.0153, 0.0152, 0.0124, 0.0134, 0.0126, |
| 0.0157, 0.0156, 0.0125, 0.0122, 0.0118, 0.0146, 0.0136, 0.0133, 0.0120, |
| 0.0128, 0.0150, 0.0123, 0.0118, 0.0110, 0.0126, 0.0151, 0.0146, 0.0120, |
| 0.0122, 0.0143, 0.0157, 0.0129, 0.0119, 0.0114, 0.0124, 0.0132, 0.0131, |
| 0.0116, 0.0119, 0.0132, 0.0133, 0.0123, 0.0103, 0.0112, 0.0143, 0.0136, |
| 0.0135, 0.0116, 0.0130, 0.0156, 0.0146, 0.0149, 0.0127, 0.0145, 0.0148, |
| 0.0119, 0.0125, 0.0111, 0.0123, 0.0128, 0.0132, 0.0133, 0.0112, 0.0126, |
| 0.0129, 0.0129, 0.0133, 0.0120, 0.0138, 0.0130, 0.0141, 0.0147, 0.0124, |
| 0.0158, 0.0127, 0.0131, 0.0152, 0.0140, 0.0150, 0.0127, 0.0118, 0.0144, |
| 0.0124, 0.0130, 0.0132, 0.0125, 0.0143, 0.0139, 0.0127, 0.0136, 0.0126, |
| 0.0144, 0.0140, 0.0124, 0.0126, 0.0124, 0.0143, 0.0143, 0.0124, 0.0119, |
| 0.0119, 0.0138, 0.0133, 0.0127, 0.0118, 0.0125, 0.0158, 0.0134, 0.0121, |
| 0.0123, 0.0127, 0.0144, 0.0131, 0.0125, 0.0123, 0.0146, 0.0157, 0.0131, |
| 0.0114, 0.0113, 0.0140, 0.0151, 0.0126, 0.0108, 0.0122, 0.0137, 0.0134, |
| 0.0116, 0.0098, 0.0111, 0.0150, 0.0138, 0.0135, 0.0114, 0.0130, 0.0142, |
| 0.0135, 0.0142, 0.0122, 0.0133, 0.0140, 0.0122, 0.0120, 0.0105, 0.0123, |
| 0.0138, 0.0126, 0.0120, 0.0453, 0.0524, 0.0517, 0.0525, 0.0508, 0.0527, |
| 0.0584, 0.0537, 0.0518, 0.0545, 0.0544, 0.0599, 0.0557, 0.0517, 0.0545, |
| 0.0551, 0.0587, 0.0544, 0.0509, 0.0543, 0.0564, 0.0542, 0.0517, 0.0501, |
| 0.0543, 0.0563, 0.0524, 0.0502, 0.0502, 0.0547, 0.0577, 0.0513, 0.0476, |
| 0.0514, 0.0542, 0.0573, 0.0496, 0.0474, 0.0520, 0.0559, 0.0584, 0.0472, |
| 0.0479, 0.0533, 0.0570, 0.0591, 0.0472, 0.0497, 0.0534, 0.0589, 0.0584, |
| 0.0434, 0.0490, 0.0535, 0.0574, 0.0581, 0.0433, 0.0512, 0.0556, 0.0590, |
| 0.0610, 0.0447, 0.0523, 0.0561, 0.0582, 0.0602, 0.0458, 0.0527, 0.0576, |
| 0.0574, 0.0584, 0.0478, 0.0548, 0.0596, 0.0563, 0.0551, 0.0121, 0.0143, |
| 0.0155, 0.0141, 0.0130, 0.0122, 0.0150, 0.0139, 0.0127, 0.0122, 0.0109, |
| 0.0133, 0.0137, 0.0131, 0.0136, 0.0118, 0.0139, 0.0122, 0.0130, 0.0135, |
| 0.0137, 0.0143, 0.0123, 0.0123, 0.0129, 0.0135, 0.0139, 0.0129, 0.0119, |
| 0.0159, 0.0144, 0.0143, 0.0136, 0.0122, 0.0139, 0.0124, 0.0126, 0.0132, |
| 0.0125, 0.0154, 0.0143, 0.0123, 0.0129, 0.0122, 0.0149, 0.0138, 0.0133, |
| 0.0119, 0.0125, 0.0146, 0.0123, 0.0124, 0.0111, 0.0145, 0.0158, 0.0139, |
| 0.0122, 0.0120, 0.0138, 0.0156, 0.0139, 0.0120, 0.0118, 0.0146, 0.0151, |
| 0.0125, 0.0115, 0.0108, 0.0136, 0.0123, 0.0127, 0.0105, 0.0120, 0.0142, |
| 0.0130, 0.0127, 0.0354, 0.0361, 0.0413, 0.0421, 0.0421, 0.0365, 0.0404, |
| 0.0450, 0.0443, 0.0430, 0.0373, 0.0423, 0.0454, 0.0442, 0.0427, 0.0392, |
| 0.0453, 0.0453, 0.0451, 0.0440, 0.0401, 0.0463, 0.0439, 0.0415, 0.0416, |
| 0.0398, 0.0462, 0.0431, 0.0403, 0.0421, 0.0415, 0.0466, 0.0448, 0.0400, |
| 0.0421, 0.0432, 0.0445, 0.0414, 0.0385, 0.0417, 0.0440, 0.0426, 0.0402, |
| 0.0387, 0.0413, 0.0442, 0.0418, 0.0382, 0.0385, 0.0417, 0.0453, 0.0416, |
| 0.0368, 0.0398, 0.0433, 0.0461, 0.0403, 0.0368, 0.0404, 0.0453, 0.0480, |
| 0.0379, 0.0373, 0.0409, 0.0461, 0.0457, 0.0353, 0.0372, 0.0418, 0.0464, |
| 0.0458, 0.0344, 0.0375, 0.0424, 0.0465, 0.0474, 0.0121, 0.0127, 0.0152, |
| 0.0134, 0.0144, 0.0106, 0.0111, 0.0144, 0.0132, 0.0131, 0.0114, 0.0140, |
| 0.0153, 0.0139, 0.0151, 0.0126, 0.0145, 0.0155, 0.0130, 0.0125, 0.0114, |
| 0.0140, 0.0145, 0.0130, 0.0128, 0.0114, 0.0127, 0.0131, 0.0128, 0.0125, |
| 0.0127, 0.0145, 0.0133, 0.0128, 0.0136, 0.0123, 0.0137, 0.0125, 0.0131, |
| 0.0137, 0.0137, 0.0143, 0.0130, 0.0118, 0.0133, 0.0136, 0.0144, 0.0127, |
| 0.0119, 0.0141, 0.0129, 0.0133, 0.0142, 0.0122, 0.0140, 0.0136, 0.0124, |
| ] |
| |
| |
| class StateChangeDetectorTest(DetectorTest): |
| def testEventGeneration(self): |
| expected_events = [ |
| StateChangeEvent(95, 90, StateChangeEvent.STATE_OPEN), |
| StateChangeEvent(153, 150, StateChangeEvent.STATE_CLOSED), |
| ] |
| self.assertExpectedEventsGenerated(StateChangeDetector(None, None), |
| change_sequence_1, expected_events, |
| ignore=AnalogStateEvent) |
| |
| def testPWMProofEvents(self): |
| expected_events = [ |
| StateChangeEvent(140, 139, StateChangeEvent.STATE_OPEN), |
| StateChangeEvent(216, 215, StateChangeEvent.STATE_CLOSED), |
| ] |
| self.assertExpectedEventsGenerated(StateChangeDetector(None, None), |
| change_sequence_pwm, expected_events, |
| ignore=AnalogStateEvent) |
| |
| def testNoisyEventGeneration(self): |
| expected_events = [ |
| StateChangeEvent(115, 115, StateChangeEvent.STATE_OPEN), |
| StateChangeEvent(195, 190, StateChangeEvent.STATE_CLOSED), |
| ] |
| self.assertExpectedEventsGenerated(StateChangeDetector(None, None), |
| change_sequence_noisy, expected_events, |
| ignore=AnalogStateEvent) |
| |
| def testNoisyEventGeneration2(self): |
| expected_events = [ |
| StateChangeEvent(42, 40, StateChangeEvent.STATE_OPEN), |
| ] |
| self.assertExpectedEventsGenerated(StateChangeDetector(None, None), |
| change_sequence_noisy2, expected_events, |
| ignore=AnalogStateEvent) |
| |
| def testMultilevelEventGeneration(self): |
| expected_events = [ |
| StateChangeEvent(193, 192, StateChangeEvent.STATE_OPEN), |
| StateChangeEvent(269, 268, StateChangeEvent.STATE_CLOSED), |
| StateChangeEvent(346, 344, StateChangeEvent.STATE_OPEN), |
| StateChangeEvent(420, 420, StateChangeEvent.STATE_CLOSED), |
| ] |
| self.assertExpectedEventsGenerated(StateChangeDetector(None, None), |
| change_sequence_multilevel, expected_events, |
| ignore=AnalogStateEvent) |