Kea2-python 0.3.6__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Kea2-python might be problematic. Click here for more details.

@@ -279,13 +279,77 @@
279
279
  width: 8%;
280
280
  min-width: 70px;
281
281
  }
282
-
282
+
283
283
  .table-custom th:nth-child(7), .table-custom td:nth-child(7) { /* Error Details */
284
284
  width: 45%;
285
285
  min-width: 400px;
286
286
  text-align: center;
287
287
  position: relative;
288
288
  }
289
+
290
+ /* Property Checking Statistics specific adjustments */
291
+ .table-property-stats th,
292
+ .table-property-stats td {
293
+ padding: 20px 14px;
294
+ line-height: 1.65;
295
+ }
296
+
297
+ .table-property-stats th:nth-child(1),
298
+ .table-property-stats td:nth-child(1) {
299
+ width: 6%;
300
+ min-width: 60px;
301
+ }
302
+
303
+ .table-property-stats th:nth-child(2),
304
+ .table-property-stats td:nth-child(2) {
305
+ width: 22%;
306
+ min-width: 200px;
307
+ text-align: left;
308
+ }
309
+
310
+ .table-property-stats th:nth-child(3),
311
+ .table-property-stats td:nth-child(3) {
312
+ width: 10%;
313
+ min-width: 90px;
314
+ }
315
+
316
+ .table-property-stats th:nth-child(4),
317
+ .table-property-stats td:nth-child(4) {
318
+ width: 9%;
319
+ min-width: 80px;
320
+ }
321
+
322
+ .table-property-stats th:nth-child(5),
323
+ .table-property-stats td:nth-child(5) {
324
+ width: 9%;
325
+ min-width: 80px;
326
+ }
327
+
328
+ .table-property-stats th:nth-child(6),
329
+ .table-property-stats td:nth-child(6) {
330
+ width: 9%;
331
+ min-width: 80px;
332
+ }
333
+
334
+ .table-property-stats th:nth-child(7),
335
+ .table-property-stats td:nth-child(7) {
336
+ width: 9%;
337
+ min-width: 80px;
338
+ }
339
+
340
+ .table-property-stats th:nth-child(8),
341
+ .table-property-stats td:nth-child(8) {
342
+ width: 26%;
343
+ min-width: 260px;
344
+ text-align: left;
345
+ }
346
+
347
+ .table-property-stats td:nth-child(8) {
348
+ display: flex;
349
+ justify-content: flex-start;
350
+ align-items: center;
351
+ gap: 0.75rem;
352
+ }
289
353
 
290
354
  .table-custom tbody tr:nth-of-type(odd) {
291
355
  background-color: rgba(0, 0, 0, 0.02);
@@ -1222,6 +1286,24 @@
1222
1286
  <span class="stat-label">Executed Properties</span>
1223
1287
  </div>
1224
1288
  </div>
1289
+ {% if triggered_crash_count %}
1290
+ <div class="col-md-2 col-sm-6">
1291
+ <div class="text-center">
1292
+ <i class="bi bi-exclamation-octagon text-danger" style="font-size: 2rem;"></i>
1293
+ <span class="stat-value value-danger">{{ triggered_crash_count }}</span>
1294
+ <span class="stat-label">Triggered Crash</span>
1295
+ </div>
1296
+ </div>
1297
+ {% endif %}
1298
+ {% if triggered_anr_count %}
1299
+ <div class="col-md-2 col-sm-6">
1300
+ <div class="text-center">
1301
+ <i class="bi bi-hourglass-split text-warning" style="font-size: 2rem;"></i>
1302
+ <span class="stat-value value-warning">{{ triggered_anr_count }}</span>
1303
+ <span class="stat-label">Triggered ANR</span>
1304
+ </div>
1305
+ </div>
1306
+ {% endif %}
1225
1307
  </div>
1226
1308
  </div>
1227
1309
  </div>
@@ -1340,6 +1422,7 @@
1340
1422
 
1341
1423
  <!-- Screenshots Section -->
1342
1424
  {% if take_screenshots %}
1425
+ {% if screenshots %}
1343
1426
  <div class="section-block">
1344
1427
  <h2 class="section-title">Test Screenshots</h2>
1345
1428
  <div class="card">
@@ -1357,6 +1440,14 @@
1357
1440
  </div>
1358
1441
  </div>
1359
1442
  </div>
1443
+ {% else %}
1444
+ <div class="section-block">
1445
+ <h2 class="section-title">Test Screenshots</h2>
1446
+ <div class="alert alert-info text-center">
1447
+ <i class="bi bi-info-circle"></i> No screenshots captured in this test session.
1448
+ </div>
1449
+ </div>
1450
+ {% endif %}
1360
1451
  {% endif %}
1361
1452
 
1362
1453
  <!-- Crash Analysis Section -->
@@ -1398,6 +1489,9 @@
1398
1489
  <th>Time</th>
1399
1490
  <th>Exception</th>
1400
1491
  <th>Process</th>
1492
+ {% if take_screenshots %}
1493
+ <th>Interaction Scenario Pages</th>
1494
+ {% endif %}
1401
1495
  <th>Details</th>
1402
1496
  </tr>
1403
1497
  </thead>
@@ -1408,20 +1502,31 @@
1408
1502
  <td>{{ crash.time }}</td>
1409
1503
  <td>{{ crash.exception_type }}</td>
1410
1504
  <td>{{ crash.process }}</td>
1505
+ {% if take_screenshots %}
1506
+ <td>
1507
+ {% if crash.screenshot_id %}
1508
+ <a href="#{{ crash.screenshot_id }}" class="link-button" onclick="scrollToScreenshot('{{ crash.screenshot_id }}')">
1509
+ <i class="bi bi-camera"></i> Screenshot {{ crash.screenshot_id }}
1510
+ </a>
1511
+ {% else %}
1512
+ <span class="text-muted">No screenshot</span>
1513
+ {% endif %}
1514
+ </td>
1515
+ {% endif %}
1411
1516
  <td>
1412
- <button class="btn btn-sm btn-outline-primary" type="button"
1413
- data-bs-toggle="collapse" data-bs-target="#crash-detail-{{ loop.index }}"
1517
+ <button class="btn btn-sm btn-outline-primary" type="button"
1518
+ data-bs-toggle="collapse" data-bs-target="#crash-detail-{{ loop.index }}"
1414
1519
  aria-expanded="false" aria-controls="crash-detail-{{ loop.index }}">
1415
1520
  <i class="bi bi-eye"></i> Details
1416
1521
  </button>
1417
- <button class="btn btn-sm btn-outline-secondary copy-stack-btn"
1522
+ <button class="btn btn-sm btn-outline-secondary copy-stack-btn"
1418
1523
  data-stack-index="{{ loop.index }}">
1419
1524
  <i class="bi bi-clipboard"></i> Copy
1420
1525
  </button>
1421
1526
  </td>
1422
1527
  </tr>
1423
1528
  <tr class="collapse" id="crash-detail-{{ loop.index }}">
1424
- <td colspan="5">
1529
+ <td colspan="{% if take_screenshots %}6{% else %}5{% endif %}">
1425
1530
  <div class="bg-light p-3 rounded">
1426
1531
  <h6 class="text-danger">Stack Trace:</h6>
1427
1532
  <pre class="text-danger mb-0 text-start" id="stack-trace-{{ loop.index }}" style="font-size: 0.9em; white-space: pre-wrap; text-align: left;">{{ crash.stack_trace }}</pre>
@@ -1436,20 +1541,31 @@
1436
1541
  <td>{{ anr.time }}</td>
1437
1542
  <td>{{ anr.reason }}</td>
1438
1543
  <td>{{ anr.process }}</td>
1544
+ {% if take_screenshots %}
1439
1545
  <td>
1440
- <button class="btn btn-sm btn-outline-primary" type="button"
1441
- data-bs-toggle="collapse" data-bs-target="#anr-detail-{{ loop.index }}"
1546
+ {% if anr.screenshot_id %}
1547
+ <a href="#{{ anr.screenshot_id }}" class="link-button" onclick="scrollToScreenshot('{{ anr.screenshot_id }}')">
1548
+ <i class="bi bi-camera"></i> Screenshot {{ anr.screenshot_id }}
1549
+ </a>
1550
+ {% else %}
1551
+ <span class="text-muted">No screenshot</span>
1552
+ {% endif %}
1553
+ </td>
1554
+ {% endif %}
1555
+ <td>
1556
+ <button class="btn btn-sm btn-outline-primary" type="button"
1557
+ data-bs-toggle="collapse" data-bs-target="#anr-detail-{{ loop.index }}"
1442
1558
  aria-expanded="false" aria-controls="anr-detail-{{ loop.index }}">
1443
1559
  <i class="bi bi-eye"></i> Details
1444
1560
  </button>
1445
- <button class="btn btn-sm btn-outline-secondary copy-stack-btn"
1561
+ <button class="btn btn-sm btn-outline-secondary copy-stack-btn"
1446
1562
  data-stack-index="anr-{{ loop.index }}">
1447
1563
  <i class="bi bi-clipboard"></i> Copy
1448
1564
  </button>
1449
1565
  </td>
1450
1566
  </tr>
1451
1567
  <tr class="collapse" id="anr-detail-{{ loop.index }}">
1452
- <td colspan="5">
1568
+ <td colspan="{% if take_screenshots %}6{% else %}5{% endif %}">
1453
1569
  <div class="bg-light p-3 rounded">
1454
1570
  <h6 class="text-dark">ANR Details:</h6>
1455
1571
  <pre class="text-dark mb-0 text-start" id="stack-trace-anr-{{ loop.index }}" style="font-size: 0.9em; white-space: pre-wrap; text-align: left;">{{ anr.trace }}</pre>
@@ -1512,7 +1628,12 @@
1512
1628
  <tr class="property-violation-row" data-page="1">
1513
1629
  <td>{{ violation.index }}</td>
1514
1630
  <td><span class="badge bg-light text-dark badge-custom">{{ violation.property_name }}</span></td>
1515
- <td><a href="#{{ violation.interaction_pages[0] }}" class="link-button">{{ violation.interaction_pages[0] }} ~ {{ violation.interaction_pages[1] }}</a></td>
1631
+ <td>
1632
+ <a href="#{{ violation.interaction_pages|last }}" class="link-button"
1633
+ onclick="scrollToScreenshot('{{ violation.interaction_pages|last }}')">
1634
+ {{ violation.interaction_pages[0] }} ~ {{ violation.interaction_pages[1] }}
1635
+ </a>
1636
+ </td>
1516
1637
  </tr>
1517
1638
  {% endfor %}
1518
1639
  </tbody>
@@ -1576,13 +1697,14 @@
1576
1697
  </div>
1577
1698
 
1578
1699
  <div class="table-responsive">
1579
- <table class="table table-custom">
1700
+ <table class="table table-custom table-property-stats">
1580
1701
  <thead>
1581
1702
  <tr>
1582
1703
  <th>Index</th>
1583
1704
  <th>Property Name <span class="badge bg-primary ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_properties }}</span></th>
1584
1705
  <th>Precondition Satisfied <span class="badge bg-success ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_precond_satisfied }}</span></th>
1585
1706
  <th>Executed <span class="badge bg-info ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_executed }}</span></th>
1707
+ <th>Passes <span class="badge bg-secondary ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_passes }}</span></th>
1586
1708
  <th>Fails <span class="badge bg-danger ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_fails }}</span> <i class="bi bi-arrow-down-up text-muted sort-icon" id="fails-sort" data-column="fails" data-order="none" style="cursor: pointer;"></i></th>
1587
1709
  <th>Errors <span class="badge bg-warning ms-2" style="font-size: 0.9rem; font-weight: 600;">{{ property_stats_summary.total_errors }}</span> <i class="bi bi-arrow-down-up text-muted sort-icon" id="errors-sort" data-column="errors" data-order="none" style="cursor: pointer;"></i></th>
1588
1710
  <th>Error Details</th>
@@ -1595,12 +1717,14 @@
1595
1717
  data-property-name="{{ property_name }}"
1596
1718
  data-precond-satisfied="{{ test_result.precond_satisfied|default(0) }}"
1597
1719
  data-executed="{{ test_result.executed|default(0) }}"
1720
+ data-pass="{{ test_result.pass_count|default(0) }}"
1598
1721
  data-fails="{{ test_result.fail|default(0) }}"
1599
1722
  data-errors="{{ test_result.error|default(0) }}">
1600
1723
  <td>{{ loop.index }}</td>
1601
1724
  <td><span class="badge bg-light text-dark badge-custom">{{ property_name }}</span></td>
1602
1725
  <td>{{ test_result.precond_satisfied|default(0) }}</td>
1603
1726
  <td>{{ test_result.executed|default(0) }}</td>
1727
+ <td>{{ test_result.pass_count|default(0) }}</td>
1604
1728
  <td><span class="badge bg-danger text-white">{{ test_result.fail|default(0) }}</span></td>
1605
1729
  <td><span class="badge bg-warning text-dark">{{ test_result.error|default(0) }}</span></td>
1606
1730
  <td>
@@ -1632,8 +1756,8 @@
1632
1756
  {% set property_index = loop.index %}
1633
1757
  {% if error_list|length == 1 %}
1634
1758
  <!-- Single error detail row -->
1635
- <tr class="collapse" id="single-error-detail-{{ property_index }}">
1636
- <td colspan="7">
1759
+ <tr class="collapse property-detail-row" data-detail-for="{{ property_name }}" id="single-error-detail-{{ property_index }}">
1760
+ <td colspan="8">
1637
1761
  <div class="bg-light p-3 rounded">
1638
1762
  <div class="mb-2">
1639
1763
  <span class="badge bg-{{ 'danger' if error_list[0].state == 'fail' else 'warning' }}">
@@ -1664,8 +1788,8 @@
1664
1788
  </tr>
1665
1789
  {% else %}
1666
1790
  <!-- Multiple errors detail row -->
1667
- <tr class="collapse" id="multi-error-detail-{{ property_index }}">
1668
- <td colspan="7">
1791
+ <tr class="collapse property-detail-row" data-detail-for="{{ property_name }}" id="multi-error-detail-{{ property_index }}">
1792
+ <td colspan="8">
1669
1793
  <div class="bg-light p-3 rounded">
1670
1794
  <!-- Error summary -->
1671
1795
  <div class="mb-3">
@@ -2218,6 +2342,18 @@
2218
2342
  function sortTable(column, order) {
2219
2343
  const container = document.getElementById('property-stats-container');
2220
2344
  const rows = Array.from(container.getElementsByClassName('property-stat-row'));
2345
+ const detailRowMap = new Map();
2346
+
2347
+ // Capture current detail rows so they can move with their parent property row
2348
+ const detailRows = Array.from(container.querySelectorAll('.property-detail-row'));
2349
+ detailRows.forEach(function(detailRow) {
2350
+ const key = detailRow.dataset.detailFor;
2351
+ if (!key) return;
2352
+ if (!detailRowMap.has(key)) {
2353
+ detailRowMap.set(key, []);
2354
+ }
2355
+ detailRowMap.get(key).push(detailRow);
2356
+ });
2221
2357
 
2222
2358
  rows.sort(function(a, b) {
2223
2359
  let valueA, valueB;
@@ -2237,11 +2373,18 @@
2237
2373
  }
2238
2374
  });
2239
2375
 
2240
- // Clear container and append sorted rows
2241
- container.innerHTML = '';
2376
+ const fragment = document.createDocumentFragment();
2242
2377
  rows.forEach(function(row) {
2243
- container.appendChild(row);
2378
+ fragment.appendChild(row);
2379
+ const detailKey = row.dataset.propertyName;
2380
+ const relatedDetailRows = detailRowMap.get(detailKey) || [];
2381
+ relatedDetailRows.forEach(function(detailRow) {
2382
+ fragment.appendChild(detailRow);
2383
+ });
2244
2384
  });
2385
+
2386
+ container.innerHTML = '';
2387
+ container.appendChild(fragment);
2245
2388
 
2246
2389
  // Re-initialize pagination after sorting
2247
2390
  initPagination('property-stats-container', 'property-stat-row', 'stats-pagination', 'stats-page-size');
@@ -3502,6 +3645,31 @@
3502
3645
  }
3503
3646
  return 1;
3504
3647
  }
3648
+
3649
+ // Function to scroll to screenshot by ID
3650
+ function scrollToScreenshot(screenshotId) {
3651
+ const screenshotElement = document.getElementById(screenshotId);
3652
+ if (screenshotElement) {
3653
+ // Scroll to the screenshot with smooth behavior
3654
+ screenshotElement.scrollIntoView({
3655
+ behavior: 'smooth',
3656
+ block: 'center'
3657
+ });
3658
+
3659
+ // Add a highlight effect
3660
+ screenshotElement.style.border = '3px solid #007bff';
3661
+ screenshotElement.style.borderRadius = '8px';
3662
+ screenshotElement.style.transition = 'border 0.3s ease';
3663
+
3664
+ // Remove highlight after 3 seconds
3665
+ setTimeout(() => {
3666
+ screenshotElement.style.border = '';
3667
+ screenshotElement.style.borderRadius = '';
3668
+ }, 3000);
3669
+ } else {
3670
+ console.warn('Screenshot with ID', screenshotId, 'not found');
3671
+ }
3672
+ }
3505
3673
  </script>
3506
3674
  </body>
3507
- </html>
3675
+ </html>