rquant 0.0.3

A quantum computing library for qubit manipulation and observation.
Documentation
use rquant::quantum::{
    constants::ket::{KET_BACK_ROTATION, KET_ONE, KET_ZERO},
    types::{quantum_gate::QuantumGate, quantum_position::QuantumPosition, qubit::Qubit},
};

#[test]
fn new_shouldmakequbit_withvalidposition() {
    let expected_initial_position = KET_ONE;
    let expected_possible_position = KET_ZERO;

    let result = Qubit::new(QuantumPosition::new(
        expected_initial_position,
        expected_possible_position,
    ));

    assert_eq!(expected_initial_position, result.initial_position());
    assert_eq!(expected_possible_position, result.possible_position());
}

#[test]
#[should_panic]
fn initialposition_shouldpanic_withoutanypositions() {
    let qubit = Qubit { positions: vec![] };

    qubit.initial_position();
}

#[test]
fn initialposition_shouldreturnposition_withvalidqubit() {
    let expected = QuantumPosition::ONE.initial_position;
    let result = Qubit::new(QuantumPosition::ONE).initial_position();

    assert_eq!(expected, result);
}

#[test]
#[should_panic]
fn possibleposition_shouldpanic_withoutanypositions() {
    let qubit = Qubit { positions: vec![] };

    qubit.possible_position();
}

#[test]
fn possibleposition_shouldreturnposition_withvalidqubit() {
    let expected = QuantumPosition::ONE.possible_position;
    let result = Qubit::new(QuantumPosition::ONE).possible_position();

    assert_eq!(expected, result);
}

#[test]
fn update_shouldaddposition_withoutanypositions() {
    let mut qubit = Qubit { positions: vec![] };

    qubit.update(QuantumPosition::ONE);

    assert_eq!(1, qubit.positions.len());
    assert_eq!(
        QuantumPosition::ONE.initial_position,
        qubit.initial_position()
    );
    assert_eq!(
        QuantumPosition::ONE.possible_position,
        qubit.possible_position()
    );
}

#[test]
fn update_shouldaddposition_toexistingpositions() {
    let mut qubit = Qubit::one();

    qubit.update(QuantumPosition::ONE);

    assert_eq!(2, qubit.positions.len());
    assert_eq!(
        QuantumPosition::ONE.initial_position,
        qubit.initial_position()
    );
    assert_eq!(
        QuantumPosition::ONE.possible_position,
        qubit.possible_position()
    );
}

#[test]
#[should_panic]
fn measure_shouldpanic_withoutanypositions() {
    let qubit = Qubit { positions: vec![] };

    qubit.measure();
}

#[test]
fn measure_shouldreturnfalse_foridentityqubit() {
    assert!(!Qubit::one().measure());
}

#[test]
fn measure_shouldreturntrue_forzeroqubit() {
    assert!(Qubit::zero().measure());
}

#[test]
#[should_panic]
fn applygate_shouldpanic_withoutanypositions() {
    let qubit = Qubit { positions: vec![] };

    qubit.apply_gate(&QuantumGate::NOT);
}

#[test]
fn applygate_shouldflipqubit_withnotgate() {
    let result = Qubit::zero().apply_gate(&QuantumGate::NOT);

    assert_eq!(Qubit::one(), result);
}

#[test]
fn applygate_shouldphaseonequbit_withphasegate() {
    let result = Qubit::one().apply_gate(&QuantumGate::PHASE);

    assert_eq!(Qubit::flip(), result);
}

#[test]
fn applygate_shouldnotphasezeroqubit_withphasegate() {
    let result = Qubit::zero().apply_gate(&QuantumGate::PHASE);

    assert_eq!(Qubit::zero(), result);
}

#[test]
fn applygate_shouldrotateonequbit_withrotategate() {
    let expected = Qubit::new(QuantumPosition::new(KET_BACK_ROTATION, KET_ZERO));

    let result = Qubit::one().apply_gate(&QuantumGate::ROTATE);

    assert_eq!(expected, result);
}

#[test]
fn notoperator_shouldflipqubit() {
    let qubit = Qubit::zero();

    let result = !qubit;

    assert_eq!(Qubit::one(), result);
}