|
2 | 2 | # Copyright (c) 2025 Scipp contributors (https://github.com/scipp) |
3 | 3 | from __future__ import annotations |
4 | 4 |
|
5 | | -from unittest.mock import Mock |
6 | | - |
7 | 5 | import pytest |
8 | 6 | import scipp as sc |
9 | 7 |
|
|
12 | 10 | LatestValueExtractor, |
13 | 11 | UpdateExtractor, |
14 | 12 | WindowAggregatingExtractor, |
15 | | - create_extractors_from_params, |
16 | | -) |
17 | | -from ess.livedata.dashboard.plot_params import ( |
18 | | - WindowAggregation, |
19 | | - WindowMode, |
20 | | - WindowParams, |
21 | 13 | ) |
| 14 | +from ess.livedata.dashboard.plot_params import WindowAggregation |
22 | 15 |
|
23 | 16 |
|
24 | 17 | class TestLatestValueExtractor: |
@@ -505,129 +498,6 @@ def test_consistent_frame_count_with_perfect_timing(self): |
505 | 498 | assert sc.allclose(result.data, expected_sum) |
506 | 499 |
|
507 | 500 |
|
508 | | -class TestCreateExtractorsFromParams: |
509 | | - """Tests for create_extractors_from_params factory function.""" |
510 | | - |
511 | | - def test_fallback_to_latest_value_when_no_params(self): |
512 | | - """Test fallback to LatestValueExtractor when no window params provided.""" |
513 | | - keys = ['key1', 'key2'] |
514 | | - |
515 | | - extractors = create_extractors_from_params(keys=keys, window=None, spec=None) |
516 | | - |
517 | | - assert len(extractors) == 2 |
518 | | - assert all(isinstance(ext, LatestValueExtractor) for ext in extractors.values()) |
519 | | - assert set(extractors.keys()) == {'key1', 'key2'} |
520 | | - |
521 | | - def test_create_latest_value_extractors_with_window_mode_latest(self): |
522 | | - """Test creation of LatestValueExtractor when window mode is 'latest'.""" |
523 | | - keys = ['key1'] |
524 | | - window = WindowParams(mode=WindowMode.latest) |
525 | | - |
526 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=None) |
527 | | - |
528 | | - assert len(extractors) == 1 |
529 | | - assert isinstance(extractors['key1'], LatestValueExtractor) |
530 | | - |
531 | | - def test_create_window_aggregating_extractors_with_window_mode_window(self): |
532 | | - """Test creation of WindowAggregatingExtractor when window mode is 'window'.""" |
533 | | - keys = ['key1', 'key2'] |
534 | | - window = WindowParams( |
535 | | - mode=WindowMode.window, |
536 | | - window_duration_seconds=5.0, |
537 | | - aggregation=WindowAggregation.nansum, |
538 | | - ) |
539 | | - |
540 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=None) |
541 | | - |
542 | | - assert len(extractors) == 2 |
543 | | - assert all( |
544 | | - isinstance(ext, WindowAggregatingExtractor) for ext in extractors.values() |
545 | | - ) |
546 | | - |
547 | | - # Verify behavior through public interface |
548 | | - extractor = extractors['key1'] |
549 | | - assert extractor.get_required_timespan() == 5.0 |
550 | | - |
551 | | - def test_spec_required_extractor_overrides_window_params(self): |
552 | | - """Test that plotter spec's required extractor overrides window params.""" |
553 | | - keys = ['key1', 'key2'] |
554 | | - window = WindowParams(mode=WindowMode.latest) |
555 | | - |
556 | | - # Create mock spec with required extractor |
557 | | - spec = Mock() |
558 | | - spec.data_requirements.required_extractor = FullHistoryExtractor |
559 | | - |
560 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=spec) |
561 | | - |
562 | | - # Should use FullHistoryExtractor despite window params |
563 | | - assert len(extractors) == 2 |
564 | | - assert all(isinstance(ext, FullHistoryExtractor) for ext in extractors.values()) |
565 | | - |
566 | | - def test_spec_with_no_required_extractor_uses_window_params(self): |
567 | | - """Test that window params are used when spec has no required extractor.""" |
568 | | - keys = ['key1'] |
569 | | - window = WindowParams(mode=WindowMode.window, window_duration_seconds=3.0) |
570 | | - |
571 | | - # Create mock spec without required extractor |
572 | | - spec = Mock() |
573 | | - spec.data_requirements.required_extractor = None |
574 | | - |
575 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=spec) |
576 | | - |
577 | | - assert isinstance(extractors['key1'], WindowAggregatingExtractor) |
578 | | - assert extractors['key1'].get_required_timespan() == 3.0 |
579 | | - |
580 | | - def test_creates_extractors_for_all_keys(self): |
581 | | - """Test that extractors are created for all provided keys.""" |
582 | | - keys = ['result1', 'result2', 'result3'] |
583 | | - window = WindowParams(mode=WindowMode.latest) |
584 | | - |
585 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=None) |
586 | | - |
587 | | - assert len(extractors) == 3 |
588 | | - assert set(extractors.keys()) == {'result1', 'result2', 'result3'} |
589 | | - assert all(isinstance(ext, LatestValueExtractor) for ext in extractors.values()) |
590 | | - |
591 | | - def test_empty_keys_returns_empty_dict(self): |
592 | | - """Test that empty keys list returns empty extractors dict.""" |
593 | | - keys = [] |
594 | | - window = WindowParams(mode=WindowMode.latest) |
595 | | - |
596 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=None) |
597 | | - |
598 | | - assert extractors == {} |
599 | | - |
600 | | - def test_window_aggregation_parameters_passed_correctly(self): |
601 | | - """Test that window aggregation parameters result in correct behavior.""" |
602 | | - keys = ['key1'] |
603 | | - window = WindowParams( |
604 | | - mode=WindowMode.window, |
605 | | - window_duration_seconds=10.5, |
606 | | - aggregation=WindowAggregation.mean, |
607 | | - ) |
608 | | - |
609 | | - extractors = create_extractors_from_params(keys=keys, window=window, spec=None) |
610 | | - |
611 | | - extractor = extractors['key1'] |
612 | | - assert isinstance(extractor, WindowAggregatingExtractor) |
613 | | - # Verify timespan through public interface |
614 | | - assert extractor.get_required_timespan() == 10.5 |
615 | | - |
616 | | - # Verify aggregation behavior by extracting data |
617 | | - data = sc.DataArray( |
618 | | - sc.array(dims=['time', 'x'], values=[[2, 4], [4, 6]], unit='m'), |
619 | | - coords={ |
620 | | - 'time': sc.array(dims=['time'], values=[0.0, 1.0], unit='s'), |
621 | | - 'x': sc.arange('x', 2, unit='m'), |
622 | | - }, |
623 | | - ) |
624 | | - result = extractor.extract(data) |
625 | | - # Mean of [2, 4] and [4, 6] = [3, 5], verifying mean aggregation was used |
626 | | - assert sc.allclose( |
627 | | - result.data, sc.array(dims=['x'], values=[3.0, 5.0], unit='m') |
628 | | - ) |
629 | | - |
630 | | - |
631 | 501 | class TestUpdateExtractorInterface: |
632 | 502 | """Tests for UpdateExtractor abstract interface.""" |
633 | 503 |
|
|
0 commit comments