// Try AtCoder
// author: Leonardoen @ NEETSDKASU

fn main() {
	let mut stdin = String::new();
    std::io::Read::read_to_string(
    	&mut std::io::stdin(),
        &mut stdin).unwrap();
	let mut stdin = stdin.split_whitespace();
    let mut get = || stdin.next().unwrap();
    macro_rules! get {
    	($t:ty) => (get().parse::<$t>().unwrap());
        () => (get!(i64));
    }
    
    let t = get!();
    
    for _ in 0..t {
    	let a = get!();
    	let b = get!();
    	let c = get!();
    	let d = get!();
        if solve(a, b, c, d) {
        	println!("Yes");
        } else {
        	println!("No");
        }
    }
}

fn solve(a: i64, b: i64, c: i64, d: i64) -> bool {
	if a < b || d < b || a % b > c {
    	// a < b 最初から足りない
        // d < b 補充量が十分でない
        // a % b > c 永遠に補充されない
    	return false;
    }
    if b - 1 <= c {
    	// 最大買った残りが常にc以下ならOK
        // (ここの時点でd >= bが保証されてるため)
    	return true;
    }
    // ((a%b) + n*(d%b))%b > c になると補充されない
    // このサイクルが常にc以下になる条件って何だ？
    // (d%b)の倍数に(a%b)を足したものがc以下のサイクル？
    // (d%b)の倍数がc-(a%b)以下になればよい？
    (d%b)%(c-(a%b))==0
}