use serde_json::{Map, Value};
#[derive(Debug)]
pub struct IPythonPre50Renderer;
impl Default for IPythonPre50Renderer {
fn default() -> Self {
Self::new()
}
}
impl IPythonPre50Renderer {
pub fn new() -> Self {
Self
}
pub fn render(&self) -> String {
String::new()
}
pub fn do_render(&self, segment_info: &mut Map<String, Value>) -> String {
segment_info.insert("client_id".to_string(), Value::String("ipython".into()));
String::new()
}
}
#[derive(Debug)]
pub struct IPythonPromptRenderer {
pub base: IPythonPre50Renderer,
}
impl Default for IPythonPromptRenderer {
fn default() -> Self {
Self::new()
}
}
impl IPythonPromptRenderer {
pub fn new() -> Self {
Self {
base: IPythonPre50Renderer::new(),
}
}
}
#[derive(Debug)]
pub struct IPythonNonPromptRenderer {
pub base: IPythonPre50Renderer,
}
impl Default for IPythonNonPromptRenderer {
fn default() -> Self {
Self::new()
}
}
impl IPythonNonPromptRenderer {
pub fn new() -> Self {
Self {
base: IPythonPre50Renderer::new(),
}
}
}
#[derive(Debug)]
pub struct RendererProxy {
pub prompt_renderer: IPythonPromptRenderer,
pub non_prompt_renderer: IPythonNonPromptRenderer,
}
impl Default for RendererProxy {
fn default() -> Self {
Self::new()
}
}
impl RendererProxy {
pub fn new() -> Self {
Self {
prompt_renderer: IPythonPromptRenderer::new(),
non_prompt_renderer: IPythonNonPromptRenderer::new(),
}
}
pub fn render_above_lines(&self) -> Vec<String> {
Vec::new()
}
pub fn render(&self, is_prompt: bool) -> String {
if is_prompt {
self.prompt_renderer.base.render()
} else {
self.non_prompt_renderer.base.render()
}
}
pub fn shutdown(&self) {
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ipython_pre50_renderer_constructs() {
let _r = IPythonPre50Renderer::new();
}
#[test]
fn do_render_injects_client_id_ipython() {
let r = IPythonPre50Renderer::new();
let mut info = Map::new();
let _ = r.do_render(&mut info);
assert_eq!(
info.get("client_id"),
Some(&Value::String("ipython".into()))
);
}
#[test]
fn do_render_preserves_existing_segment_info_keys() {
let r = IPythonPre50Renderer::new();
let mut info = Map::new();
info.insert("user".to_string(), Value::String("alice".into()));
let _ = r.do_render(&mut info);
assert_eq!(info.get("user"), Some(&Value::String("alice".into())));
assert_eq!(
info.get("client_id"),
Some(&Value::String("ipython".into()))
);
}
#[test]
fn do_render_overwrites_pre_existing_client_id() {
let r = IPythonPre50Renderer::new();
let mut info = Map::new();
info.insert("client_id".to_string(), Value::String("other".into()));
let _ = r.do_render(&mut info);
assert_eq!(
info.get("client_id"),
Some(&Value::String("ipython".into()))
);
}
#[test]
fn ipython_prompt_renderer_wraps_base() {
let r = IPythonPromptRenderer::new();
let _ = r.base;
}
#[test]
fn ipython_non_prompt_renderer_wraps_base() {
let r = IPythonNonPromptRenderer::new();
let _ = r.base;
}
#[test]
fn renderer_proxy_has_two_inner_renderers() {
let p = RendererProxy::new();
let _: &IPythonPromptRenderer = &p.prompt_renderer;
let _: &IPythonNonPromptRenderer = &p.non_prompt_renderer;
}
#[test]
fn renderer_proxy_render_dispatches_on_is_prompt() {
let p = RendererProxy::new();
assert_eq!(p.render(true), "");
assert_eq!(p.render(false), "");
}
#[test]
fn renderer_proxy_render_above_lines_returns_vec() {
let p = RendererProxy::new();
let lines = p.render_above_lines();
assert!(lines.is_empty());
}
#[test]
fn renderer_proxy_shutdown_is_callable() {
let p = RendererProxy::new();
p.shutdown();
}
}