use chrome_for_testing::{
Channel, Download, Platform, Version, VersionInChannel, VersionWithoutChannel,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VersionRequest {
Latest,
LatestIn(Channel),
Fixed(Version),
}
impl From<Channel> for VersionRequest {
fn from(channel: Channel) -> Self {
Self::LatestIn(channel)
}
}
impl From<Version> for VersionRequest {
fn from(version: Version) -> Self {
Self::Fixed(version)
}
}
impl VersionRequest {
#[must_use]
pub fn stable() -> Self {
Self::LatestIn(Channel::Stable)
}
#[must_use]
pub fn beta() -> Self {
Self::LatestIn(Channel::Beta)
}
#[must_use]
pub fn dev() -> Self {
Self::LatestIn(Channel::Dev)
}
#[must_use]
pub fn canary() -> Self {
Self::LatestIn(Channel::Canary)
}
}
#[derive(Debug)]
pub struct SelectedVersion {
pub(crate) channel: Option<Channel>,
pub(crate) version: Version,
pub(crate) chrome: Option<Download>,
pub(crate) chromedriver: Option<Download>,
}
impl SelectedVersion {
#[must_use]
pub fn channel(&self) -> Option<&Channel> {
self.channel.as_ref()
}
#[must_use]
pub fn version(&self) -> Version {
self.version
}
#[must_use]
pub fn has_chrome_download(&self) -> bool {
self.chrome.is_some()
}
#[must_use]
pub fn has_chromedriver_download(&self) -> bool {
self.chromedriver.is_some()
}
}
impl From<(VersionWithoutChannel, Platform)> for SelectedVersion {
fn from((v, p): (VersionWithoutChannel, Platform)) -> Self {
SelectedVersion {
channel: None,
version: v.version,
chrome: v.downloads.chrome_for_platform(p).cloned(),
chromedriver: v.downloads.chromedriver_for_platform(p).cloned(),
}
}
}
impl From<(VersionInChannel, Platform)> for SelectedVersion {
fn from((v, p): (VersionInChannel, Platform)) -> Self {
let chrome_download = v.downloads.chrome_for_platform(p).cloned();
let chromedriver_download = v.downloads.chromedriver_for_platform(p).cloned();
SelectedVersion {
channel: Some(v.channel),
version: v.version,
chrome: chrome_download,
chromedriver: chromedriver_download,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use assertr::prelude::*;
mod version_request {
use super::*;
#[test]
fn from_channel_resolves_to_latest_in_channel() {
assert_that!(VersionRequest::from(Channel::Stable))
.is_equal_to(VersionRequest::LatestIn(Channel::Stable));
}
#[test]
fn named_constructors_match_explicit_variants() {
assert_that!(VersionRequest::stable())
.is_equal_to(VersionRequest::LatestIn(Channel::Stable));
assert_that!(VersionRequest::beta())
.is_equal_to(VersionRequest::LatestIn(Channel::Beta));
assert_that!(VersionRequest::dev()).is_equal_to(VersionRequest::LatestIn(Channel::Dev));
assert_that!(VersionRequest::canary())
.is_equal_to(VersionRequest::LatestIn(Channel::Canary));
}
#[test]
fn from_parsed_version_resolves_to_fixed() {
let v: Version = "135.0.7019.0".parse().expect("valid version literal");
assert_that!(VersionRequest::from(v)).is_equal_to(VersionRequest::Fixed(v));
}
}
}