// Copyright 2020 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.

//! Integration tests using LibVDA fake decode implemenation.

use libvda::decode::*;
use libvda::*;

fn create_vda_instance() -> VdaInstance {
    VdaInstance::new(VdaImplType::Fake).expect("failed to create VDAInstance")
}

#[test]
fn test_create_instance() {
    let instance = create_vda_instance();
    let caps = instance.get_capabilities();

    assert_ne!(caps.input_formats.len(), 0);
    assert_ne!(caps.output_formats.len(), 0);
}

#[test]
fn test_initialize_decode_session() {
    let instance = create_vda_instance();
    let _session = instance
        .open_session(Profile::VP8)
        .expect("failed to open a session for VP8");
    // `drop(instance)` here must cause a compile error because `_session` must be dropped in
    // advance.
}

#[test]
fn test_decode_and_get_picture_ready_fake() {
    let instance = create_vda_instance();
    let mut session = instance
        .open_session(Profile::VP8)
        .expect("failed to open a session");

    // Call decode() with dummy arguments.
    let fake_bitstream_id = 12345;
    session
        .decode(
            fake_bitstream_id,
            1, // fd
            0, // offset
            0, // bytes_used
        )
        .expect("failed to send a decode request");

    // Since we are using the fake backend,
    // we must get a event immediately after calling decode().
    match session.read_event() {
        Ok(Event::PictureReady { bitstream_id, .. }) => {
            assert_eq!(bitstream_id, fake_bitstream_id);
        }
        Ok(event) => panic!("Obtained event is not PictureReady but {:?}", event),
        Err(msg) => panic!(msg),
    }
}
