function results = run_dataset_smoke_tests(varargin)
%RUN_DATASET_SMOKE_TESTS  Download and run simple processing on registered datasets.
%
%   RESULTS = RUN_DATASET_SMOKE_TESTS()
%   RESULTS = RUN_DATASET_SMOKE_TESTS('url', 'https://.../datasets/', ...
%       'plot', false, 'stop_on_error', false)
%
%   Walks UFF_DATASET_REGISTRY: for each entry, downloads the file to data_path()
%   (if missing) and runs SIMPLE_PROCESS_DATASET.
%
%   Requires network access on first run for each file.

p = inputParser;
addParameter(p, 'url', 'https://www.ustb.no/datasets', @(s) ischar(s) || isstring(s));
addParameter(p, 'plot', false, @islogical);
addParameter(p, 'stop_on_error', false, @islogical);
parse(p, varargin{:});

base_url = char(p.Results.url);
if endsWith(base_url, '/')
    base_url = base_url(1:end-1);
end
want_plot = p.Results.plot;
stop_on_error = p.Results.stop_on_error;

local_path = data_path();
if local_path(end) ~= filesep
    local_path = [local_path filesep];
end

T = uff_dataset_registry();
n = numel(T);
results = repmat(struct('filename', '', 'ok', false, 'message', '', 'note', ''), n, 1);

fprintf('Dataset smoke tests: %d registered file(s), data_path=%s\n', n, local_path);

for i = 1:n
    fn = T(i).filename;
    results(i).filename = fn;
    results(i).note = T(i).note;

    try
        tools.download(fn, base_url, local_path);
    catch ME
        results(i).message = ['Download failed: ' ME.message];
        fprintf('[FAIL] %s — %s\n', fn, results(i).message);
        if stop_on_error
            return
        else
            continue
        end
    end

    uff_file = fullfile(local_path, fn);
    R = simple_process_dataset(uff_file, 'channel_h5', T(i).channel_h5, ...
        'mode', T(i).mode, 'plot', want_plot);

    results(i).ok = R.ok;
    results(i).message = R.message;

    if R.ok
        fprintf('[ OK ] %s — %s\n', fn, R.message);
    else
        fprintf('[FAIL] %s — %s\n', fn, R.message);
        if stop_on_error
            return
        end
    end
end

n_ok = sum([results.ok]);
fprintf('Finished: %d / %d succeeded.\n', n_ok, n);
end
Dataset smoke tests: 33 registered file(s), data_path=C:\Repositories\ustb\data\
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.04 seconds.
[ OK ] Verasonics_P2-4_parasternal_long_small.uff — OK, max(abs(image))=314365
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.16 seconds.
[ OK ] L7_FI_IUS2018.uff — OK, max(abs(image))=54700.2
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 1.11 seconds.
[ OK ] L7_CPWC_193328.uff — OK, max(abs(image))=1.66969e+07
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
Warning: You just deleted all frames except frames 1 to 1, I hope you meant to! 
USTB MEX C beamformer...Completed in 0.16 seconds.
[ OK ] L7_CPWC_TheGB.uff — OK, max(abs(image))=70715.7
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.11 seconds.
[ OK ] Alpinion_L3-8_FI_hyperechoic_scatterers.uff — OK, max(abs(image))=29305.7
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.75 seconds.
[ OK ] Alpinion_L3-8_FI_hypoechoic.uff — OK, max(abs(image))=208384
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 1.66 seconds.
[ OK ] Alpinion_L3-8_CPWC_hyperechoic_scatterers.uff — OK, max(abs(image))=534420
UFF: reading channel_data_speckle [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
Warning: The modulation frequency is not specified. The estimated central
frequency will be used.  
Estimating power spectrum
Warning: The downsampling frequency is not specified. Using 2 *
modulation_frequency. 
Warning: The input sample frequency is not a multiple of the specified
downsample frequency. Rounding up the downsample frequency to the next higher
downsample frequency. 
Low-pass filtering
USTB MEX C beamformer...Completed in 5.44 seconds.
[ OK ] FieldII_STAI_uniform_fov.uff — OK, max(abs(image))=2.15814
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 15.41 seconds.
[ OK ] FieldII_STAI_dynamic_range.uff — OK, max(abs(image))=3.36481e-05
UFF: reading channel_data [uff.channel_data]
USTB MEX C beamformer...Completed in 2.52 seconds.
[ OK ] ARFI_dataset.uff — OK, max(abs(image))=41211.7
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 3.53 seconds.
[ OK ] PICMUS_experiment_resolution_distortion.uff — OK, max(abs(image))=62.3832
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 3.10 seconds.
[ OK ] PICMUS_simulation_resolution_distortion.uff — OK, max(abs(image))=907.644
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 3.49 seconds.
[ OK ] PICMUS_experiment_contrast_speckle.uff — OK, max(abs(image))=27.6324
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 3.12 seconds.
[ OK ] PICMUS_simulation_contrast_speckle.uff — OK, max(abs(image))=67.285
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 3.47 seconds.
[ OK ] PICMUS_carotid_cross.uff — OK, max(abs(image))=337.789
USTB download tool
File:		Verasonics_P2-4_parasternal_long_subject_1.uff
URL:		https://www.ustb.no/datasets/Verasonics_P2-4_paras
			ternal_long_subject_1.uff
Path:		C:\Repositories\ustb\data\
[FAIL] Verasonics_P2-4_parasternal_long_subject_1.uff — Download failed: The HTTP request failed with error 404
UFF: reading ./channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.09 seconds.
[ OK ] FieldII_P4_point_scatterers.uff — OK, max(abs(image))=26.8669
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
Warning: The downsampling frequency is not specified. Using 2 *
modulation_frequency. 
Warning: The input sample frequency is not a multiple of the specified
downsample frequency. Rounding up the downsample frequency to the next higher
downsample frequency. 
Band-pass filtering
Low-pass filtering
USTB MEX C beamformer...Completed in 11.83 seconds.
[ OK ] experimental_STAI_dynamic_range.uff — OK, max(abs(image))=175.21
USTB download tool
File:		FieldII_STAI_axial_gradient_v2.uff
URL:		https://www.ustb.no/datasets/FieldII_STAI_axial_gr
			adient_v2.uff
Path:		C:\Repositories\ustb\data\
[FAIL] FieldII_STAI_axial_gradient_v2.uff — Download failed: The HTTP request failed with error 404
USTB download tool
File:		FieldII_STAI_gradient_full_field_100.uff
URL:		https://www.ustb.no/datasets/FieldII_STAI_gradient
			_full_field_100.uff
Path:		C:\Repositories\ustb\data\
[FAIL] FieldII_STAI_gradient_full_field_100.uff — Download failed: The HTTP request failed with error 404
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
Warning: You just deleted all frames except frames 1 to 1, I hope you meant to! 
USTB MEX C beamformer...Completed in 0.04 seconds.
[ OK ] P4_FI_121444_45mm_focus.uff — OK, max(abs(image))=261066
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 6.61 seconds.
[ OK ] FieldII_speckle_simulation.uff — OK, max(abs(image))=1301.18
USTB download tool
File:		test02.uff
URL:		https://www.ustb.no/datasets/test02.uff
Path:		C:\Repositories\ustb\data\
[FAIL] test02.uff — Download failed: The HTTP request failed with error 404
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.61 seconds.
[ OK ] speckle_sim_FI_P4_probe_apod_3_speckle_long_many_angles.uff — OK, max(abs(image))=63.0809
UFF: reading /channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.11 seconds.
[ OK ] L7_FI_Verasonics_CIRS_points.uff — OK, max(abs(image))=49183.8
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 0.33 seconds.
[ OK ] L7_FI_carotid_cross_sub_2.uff — OK, max(abs(image))=72218.6
UFF: reading /mix [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
USTB MEX C beamformer...Completed in 19.07 seconds.
[ OK ] invitro_20.uff — OK, max(abs(image))=7354.69
USTB download tool
File:		insilico_side_100_M45.uff
URL:		https://www.ustb.no/datasets/insilico_side_100_M45
			.uff
Path:		C:\Repositories\ustb\data\
Downloading 6556 / 6556 MB...done!
[FAIL] insilico_side_100_M45.uff — Download failed: The error "Error saving to local data stream." occurred while communicating with URL 'https://www.ustb.no/datasets/insilico_side_100_M45.uff'.
USTB download tool
File:		insilico_20.uff
URL:		https://www.ustb.no/datasets/insilico_20.uff
Path:		C:\Repositories\ustb\data\
[FAIL] insilico_20.uff — Download failed: The HTTP request failed with error 404
UFF: reading channel_data [uff.channel_data]
USTB MEX C beamformer...Completed in 0.16 seconds.
[ OK ] FieldII_CPWC_point_scatterers_res_v2.uff — OK, max(abs(image))=109.458
USTB download tool
File:		P4_FI.uff
URL:		https://www.ustb.no/datasets/P4_FI.uff
Path:		C:\Repositories\ustb\data\
[FAIL] P4_FI.uff — Download failed: The HTTP request failed with error 404
UFF: reading b_data_das [uff.beamformed_data]
[ OK ] beamformed_simulated_data.uff — OK, max(abs(image))=6.40137e+09
UFF: reading b_data_das [uff.beamformed_data]
[ OK ] beamformed_experimental_data.uff — OK, max(abs(image))=1.74166e+06
Finished: 26 / 33 succeeded.

ans = 

  33×1 struct array with fields:

    filename
    ok
    message
    note