// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use {
    anyhow::Error,
    bt_test_harness::{access::AccessHarness, inspect::InspectHarness},
    diagnostics_reader::DiagnosticsHierarchy,
    fuchsia_bluetooth::{expect_eq, expectation::asynchronous::ExpectableExt},
    test_harness::run_suite,
};

const GAP_CHILD_NODE: &str = "system";

fn hierarchy_has_child(hierarchy: &DiagnosticsHierarchy, name: &str) -> bool {
    hierarchy.children.iter().find(|c| c.name == name).is_some()
}

async fn test_gap_hierarchy_published(
    (harness, _btgap): (InspectHarness, AccessHarness),
) -> Result<(), Error> {
    harness.write_state().moniker = vec!["bt-gap.cmx".to_string()];
    let min_num_hierarchies: usize = 1;
    let mut state = harness.expect_n_hierarchies(min_num_hierarchies).await?;

    let mut gap_hierarchies_count: usize = 0;

    loop {
        let hierarchy = state.hierarchies.pop();
        match hierarchy {
            Some(hierarchy) => {
                if hierarchy_has_child(&hierarchy, GAP_CHILD_NODE) {
                    gap_hierarchies_count += 1;
                }
            }
            None => break,
        }
    }

    expect_eq!(1, gap_hierarchies_count)?;

    Ok(())
}

/// Run all test cases.
pub fn run_all() -> Result<(), Error> {
    run_suite!("inspect", [test_gap_hierarchy_published])
}
