pub instance: InstanceName,
}
+#[derive(Debug,Clone,Eq,PartialEq,Ord,PartialOrd,Hash)]
+pub struct Vpid(pub String);
+impl Display for Vpid {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.write_str(&self.0) }
+}
+
impl Window {
pub fn table(&self) -> String { self.instance.to_string() }
}
impl<'g> WindowGuard<'g> {
#[throws(AE)]
- pub fn find_piece(&'g self, pieceid: &'g str) -> PieceElement<'g> {
- let id = format!("use{}", pieceid);
- let elem = self.su.driver.find_element(By::Id(&id))?;
+ pub fn piece_vpid(&'g self, some_pieceid: &'_ str) -> Vpid {
+ if some_pieceid.contains('.') { return Vpid(some_pieceid.to_owned()) }
+ let (l, r) = some_pieceid.split_once('v').unwrap();
+ let s = format!(r#"{{ "idx":{}, "version":{} }}"#, l,r); // cheesy!
+ let kd: slotmap::KeyData = serde_json::from_str(&s).unwrap();
+ let piece: PieceId = kd.into();
+ let resp = self.su.mgmt_conn().cmd(&MC::AlterGame {
+ game: TABLE.parse().unwrap(),
+ how: MgmtGameUpdateMode::Online,
+ insns: vec![ MgmtGameInstruction::PieceIdLookupFwd {
+ piece,
+ player: self.w.player,
+ } ],
+ })?;
+ let vpid = if_chain!{
+ if let MgmtResponse::AlterGame { error: None, responses } = &resp;
+ if let [MgmtGameResponse::VisiblePieceId(vpid)] = responses.as_slice();
+ then { vpid }
+ else { unreachable(Err::<Void,_>(&resp).unwrap()) }
+ };
+ Vpid(vpid.unwrap().to_string())
+ }
+
+ #[throws(AE)]
+ pub fn vpidelem(&'g self, prefix: &'_ str, some_pieceid: &'_ str) -> String {
+ prefix.to_string() + &self.piece_vpid(some_pieceid)?.0
+ }
+
+ #[throws(AE)]
+ pub fn find_piece(&'g self, pieceid: &'_ str) -> PieceElement<'g> {
+ let pieceid = self.piece_vpid(pieceid)?;
+ let elemid = format!("use{}", &pieceid);
+ let elem = self.su.driver.find_element(By::Id(&elemid))?;
PieceElement {
- pieceid, elem,
+ elem,
+ pieceid: pieceid.clone(),
w: self,
}
}
let held = self.execute_script(&format!(r##"
let pc = pieces['{}'];
return pc.held;
- "##, &pc))?;
+ "##, &self.piece_vpid(pc)?))?;
let held = held.value();
dbg!(held);
match held {
pub type WebPos = (WebCoord, WebCoord);
pub struct PieceElement<'g> {
- pieceid: &'g str,
+ pieceid: Vpid,
w: &'g WindowGuard<'g>,
elem: t4::WebElement<'g>,
}
}
#[throws(AE)]
- fn move_pc<'g>(self, w: &'g WindowGuard, pc: &str) -> Self {
+ fn move_pc<'g>(self, w: &'g WindowGuard, pc: &'_ str) -> Self {
(||{
let p = w.find_piece(pc).context("find")?;
let pos = p.posw().context("get pos")?;
deref_to_field!{Ctx, Setup, su}
usual_wanted_tests!{Ctx, su}
-const HAND: &str = "6.1";
-const PAWN: &str = "7.1";
+const HAND: &str = "6v1";
+const PAWN: &str = "7v1";
const ALICE: &str = "1#1";
#[throws(AE)]
w.synch()?;
let dasharray = player.map(player_dasharray).transpose()?;
- let euse = w.find_element(By::Id(&format!("piece{}", pc)))?;
+ let euse = w.find_element(By::Id(&w.vpidelem("piece", pc)?))?;
let epath = euse.find_element(By::Tag("path"))?;
let attr = epath.get_attribute("stroke-dasharray")?;
let alice_p1g = {
let mut w = su.w(&self.alice)?;
w.synch()?;
- let p1 = w.find_piece("1.1")?;
- let p2 = w.find_piece("2.1")?;
+ let p1 = w.find_piece("1v1")?;
+ let p2 = w.find_piece("2v1")?;
let p1g_old = p1.posg()?;
let (p2x,p2y) = p2.posw()?;
{
let mut w = su.w(&self.bob)?;
w.synch()?;
- let p1 = w.find_piece("1.1")?;
+ let p1 = w.find_piece("1v1")?;
assert_eq!(p1.posg()?, alice_p1g);
}
}
#[throws(AE)]
fn rotate(&mut self) -> &'static str {
- let pc = "4.1";
+ let pc = "4v1";
let su = &mut self.su;
let chk = |w: &WindowGuard<'_>| {
let transform = format!("rotate(-90)");
- let pd = w.find_element(By::Id(&format!("piece{}",pc)))?;
+ let pd = w.find_element(By::Id(&w.vpidelem("piece",pc)?))?;
assert_eq!(pd.get_attribute("transform")?, Some(transform));
Ok::<_,AE>(())
};
#[throws(AE)]
fn conflict(&mut self) {
- let pc = "1.1";
+ let pc = "1v1";
let su = &mut self.su;
{
- let pc = "4.1";
+ let pc = "4v1";
let w = su.w(&self.alice)?;
w.action_chain()
.move_pc(&w, pc)?