third level
diff --git a/src/geometries/Geometries.java b/src/geometries/Geometries.java
new file mode 100644
index 0000000..0e7444c
--- /dev/null
+++ b/src/geometries/Geometries.java
@@ -0,0 +1,64 @@
+/**
+ * 
+ */
+package geometries;
+
+import primitives.Point3D;
+import primitives.Ray;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * @author Adiel
+ *
+ *         Composite class for all Intersectable objects
+ */
+public class Geometries implements Intersectable {
+	private List<Intersectable> _intersectableList;
+
+	/**
+	 * Default constructor that initializes the field with an empty list
+	 */
+	public Geometries() {
+		_intersectableList = new LinkedList<>();
+	}
+
+	/**
+	 * Constructor for the geometries
+	 * @param geometries for the intersections
+	 */
+	public Geometries(Intersectable... geometries) {
+		_intersectableList = new LinkedList<>();
+		add(geometries);
+
+	}
+
+	/**
+	 * Adding to list
+	 * @param geometries
+	 */
+	public void add(Intersectable... geometries) {
+		_intersectableList.addAll(Arrays.asList(geometries));
+
+	}
+
+	@Override
+	public List<Point3D> findIntersections(Ray ray) {
+		List<Point3D> result = null;
+
+		// A loop that adds to the list all the bodies that have
+		// intersections with the ray
+		for (Intersectable item : _intersectableList) {
+			List<Point3D> elementList = item.findIntersections(ray);
+			if (elementList != null) {
+				if (result == null) {
+					result = new LinkedList<>();
+				}
+				result.addAll(elementList);
+			}
+		}
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/src/geometries/Geometry.java b/src/geometries/Geometry.java
index e87ca32..dcd47be 100644
--- a/src/geometries/Geometry.java
+++ b/src/geometries/Geometry.java
@@ -1,5 +1,6 @@
 package geometries;

 

+

 import primitives.Point3D;

 import primitives.Vector;

 

@@ -9,11 +10,13 @@
  * @author Adiel

  *

  */

-public interface Geometry {

+public interface Geometry extends Intersectable{

 	/**

 	 * 

 	 * @param point3D of the vector

 	 * @return normalized vector 

 	 */

 	Vector getNormal(Point3D point3D);

+

+

 }

diff --git a/src/geometries/Intersectable.java b/src/geometries/Intersectable.java
new file mode 100644
index 0000000..c3e8508
--- /dev/null
+++ b/src/geometries/Intersectable.java
@@ -0,0 +1,23 @@
+/**
+ * 
+ */
+package geometries;
+
+import primitives.*;
+
+import java.util.List;
+
+/**
+ * @author Adiel
+ *
+ * Interface for intersection points
+ */
+public interface Intersectable {
+    /**
+     * Find all intersection points from the ray
+     *
+     * @param ray the famous Ray pointing to
+     * @return intersection points
+     */
+    List<Point3D> findIntersections(Ray ray);
+}
diff --git a/src/geometries/Plane.java b/src/geometries/Plane.java
index 93ba896..26ae874 100644
--- a/src/geometries/Plane.java
+++ b/src/geometries/Plane.java
@@ -1,7 +1,9 @@
 package geometries;

 

-import primitives.Point3D;

-import primitives.Vector;

+import java.util.List;

+import static primitives.Util.*;

+

+import primitives.*;

 

 /**

  * Plane class represents a plane using a point in space and a vertical vector

@@ -18,7 +20,7 @@
 	/**

 	 * Plane constructor receive the point and vertical

 	 * 

-	 * @param q0 the point

+	 * @param q0     the point

 	 * @param normal the vertical

 	 */

 	public Plane(Point3D q0, Vector normal) {

@@ -34,11 +36,11 @@
 	 * @param p3 for the third point

 	 */

 	public Plane(Point3D p1, Point3D p2, Point3D p3) {

-		this.q0=p1;

-        Vector v1=p2.subtract(p1);

-        Vector v2=p3.subtract(p1);

-        Vector n =v1.crossProduct(v2);

-        this.normal=n.normalize();

+		this.q0 = p1;

+		Vector v1 = p2.subtract(p1);

+		Vector v2 = p3.subtract(p1);

+		Vector n = v1.crossProduct(v2);

+		this.normal = n.normalize();

 

 	}

 

@@ -69,4 +71,32 @@
 		return normal;

 	}

 

+	

+	@Override

+	public List<Point3D> findIntersections(Ray ray) {

+		List<Point3D> result = null;

+		

+		//Check if q0=p0 

+		if (q0.equals(ray.getP0())) {

+			return null;

+		}

+		

+		double numerator = alignZero(normal.dotProduct(q0.subtract(ray.getP0())));

+		double denominator = alignZero(normal.dotProduct(ray.getDir()));

+ 

+		//Check if numerator or denominator equal zero

+		if (isZero(numerator) || isZero(denominator)) {

+			return null;

+		}

+		

+		double t = numerator / denominator;

+		if (t < 0) {

+			return result;//result=null

+		}

+

+		

+		return List.of(ray.getPoint(t));

+

+	}

+

 }

diff --git a/src/geometries/Polygon.java b/src/geometries/Polygon.java
index ab073eb..ec98b6b 100644
--- a/src/geometries/Polygon.java
+++ b/src/geometries/Polygon.java
@@ -85,4 +85,45 @@
 	public Vector getNormal(Point3D point) {

 		return plane.getNormal();

 	}

+

+	@Override

+	public List<Point3D> findIntersections(Ray ray) {

+		List<Point3D> result = plane.findIntersections(ray);

+		

+		//Check if intersect ray with the plane.

+		if (result == null) {

+			return null;

+		}

+		

+		//Check if the intersection point with its plane is inside the polygon

+		Vector v = ray.getDir();

+		Point3D P0 = ray.getP0();

+		Vector v1 = vertices.get(0).subtract(P0);

+		Vector v2 = vertices.get(1).subtract(P0);

+

+		double t = alignZero(v.dotProduct(v1.crossProduct(v2).normalize()));

+		if (isZero(t)) {

+			return null;

+		}

+		

+		boolean sign = t > 0;

+		int size = vertices.size();

+		Vector vn = vertices.get(size - 1).subtract(P0);

+		t = alignZero(v.dotProduct(vn.crossProduct(v1).normalize()));

+		if (isZero(t) || sign ^ (t > 0)) {

+			return null;

+		}

+		

+		//Check if all vertices have the same sign

+		for (int i = 2; i < size; i++) {

+			v1 = v2;

+			v2 = vertices.get(i).subtract(P0);

+			t = alignZero(v.dotProduct(v1.crossProduct(v2).normalize()));

+			if (isZero(t) || sign ^ (t > 0)) {

+				return null;

+			}

+

+		}

+		return result;

+	}

 }

diff --git a/src/geometries/Sphere.java b/src/geometries/Sphere.java
index 00c6c08..ba98378 100644
--- a/src/geometries/Sphere.java
+++ b/src/geometries/Sphere.java
@@ -1,7 +1,11 @@
 package geometries;

 

+import java.util.List;

+

 import primitives.Point3D;

+import primitives.Ray;

 import primitives.Vector;

+import static primitives.Util.*;

 

 /**

  * Sphere class represent sphere by center point radius.

@@ -54,4 +58,42 @@
 		return vector.normalize();

 	}

 

+	@Override

+	public List<Point3D> findIntersections(Ray ray) {

+		List<Point3D> result = null;

+		Point3D P0 = ray.getP0();

+		Vector v = ray.getDir();

+

+		if (center.equals(P0)) {

+			

+			return List.of(ray.getPoint(radius));

+

+		}

+

+		Vector u = center.subtract(P0);

+

+		double tm = alignZero(u.dotProduct(v));

+		double d = alignZero(Math.sqrt(u.lengthSquared() - tm * tm));

+

+		if (d > radius) {

+			return null;

+		}

+		double th = alignZero(Math.sqrt(radius * radius - d * d));

+

+		double t1 = alignZero(tm - th);

+		double t2 = alignZero(tm + th);

+

+		if (t1 > 0 && t2 > 0) {

+			return List.of(ray.getPoint(t1), ray.getPoint(t2));

+		

+		} else if (t1 > 0) {

+			return List.of(ray.getPoint(t1));

+		

+		} else if (t2 > 0) {

+			return List.of(ray.getPoint(t2));

+		}

+		

+		return result;

+	}

+

 }

diff --git a/src/geometries/Triangle.java b/src/geometries/Triangle.java
index e51cd27..9efcba7 100644
--- a/src/geometries/Triangle.java
+++ b/src/geometries/Triangle.java
@@ -1,7 +1,9 @@
 package geometries;

 

+

 import primitives.Point3D;

 

+

 /**

  * Triangle class represent a polygon with three vertices.

  * 

diff --git a/src/geometries/Tube.java b/src/geometries/Tube.java
index b01814c..c7df809 100644
--- a/src/geometries/Tube.java
+++ b/src/geometries/Tube.java
@@ -5,6 +5,8 @@
 import primitives.Vector;

 import static primitives.Util.*;

 

+import java.util.List;

+

 /**

  * Tube class represent tube by radius and ray.

  * 

@@ -68,4 +70,10 @@
 		Vector vector = point3d.subtract(O);

 		return vector.normalize();

 	}

+

+	@Override

+	public List<Point3D> findIntersections(Ray ray) {

+		// TODO Auto-generated method stub

+		return null;

+	}

 }

diff --git a/src/primitives/Point3D.java b/src/primitives/Point3D.java
index 49ea698..280a703 100644
--- a/src/primitives/Point3D.java
+++ b/src/primitives/Point3D.java
@@ -62,7 +62,10 @@
 	 */

 	public Vector subtract(Point3D point3D) {

 

-		return new Vector(_x.coord - point3D._x.coord, _y.coord - point3D._y.coord, _z.coord - point3D._z.coord);

+		return new Vector(

+				_x.coord - point3D._x.coord,

+				_y.coord - point3D._y.coord,

+				_z.coord - point3D._z.coord);

 	}

 

 	/**

@@ -110,4 +113,9 @@
 		return "(" + _x + ", " + _y + ", " + _z + ")";

 	}

 

+	public double getX() {

+		

+		return _x.coord;

+	}

+

 }

diff --git a/src/primitives/Ray.java b/src/primitives/Ray.java
index 9faaec7..ec012b3 100644
--- a/src/primitives/Ray.java
+++ b/src/primitives/Ray.java
@@ -21,7 +21,7 @@
     public Ray(Point3D p0, Vector dir) {

 		

 		this.p0 = p0;

-		this.dir = dir;

+		this.dir = dir.normalized();

 	}

 

    /**

@@ -55,5 +55,8 @@
 	public String toString() {

 		return   p0 + ", " + dir;

 	}

-	

+

+	public Point3D getPoint(double t){

+        return p0.add(dir.scale(t));

+    }

 }

diff --git a/src/unittests/GeometriesTests.java b/src/unittests/GeometriesTests.java
new file mode 100644
index 0000000..4d8bcaa
--- /dev/null
+++ b/src/unittests/GeometriesTests.java
@@ -0,0 +1,75 @@
+/**
+ * 
+ */
+package unittests;
+
+import static org.junit.Assert.*;
+
+import java.util.List;
+
+import primitives.*;
+
+import org.junit.Test;
+
+import geometries.*;
+
+/**
+ * @author Adiel
+ *
+ */
+public class GeometriesTests {
+
+	/**
+	 * Test method for {@link geometries.Geometries#findIntersections(primitives.Ray)}.
+	 */
+	@Test
+	public void testFindIntersections() {
+		Plane plane = new Plane(
+                new Point3D(1, 0, 0),
+                new Point3D(0, 1, 0),
+                new Point3D(0, 0, 1));
+
+        Sphere sphere = new Sphere(new Point3D(0, 6, 0), 2);
+        Triangle triangle = new Triangle(
+                new Point3D(1, 0, 0),
+                new Point3D(3, 2, 0),
+                new Point3D(5, 0, 0));
+        Geometries geometries = new Geometries(plane, sphere, triangle);
+
+        // ============ Equivalence Partitions Tests ==============
+
+        //TC01: Some (but not all) shapes are intersected
+        Ray ray = new Ray(new Point3D(2, 0.5, 3), new Vector(0, 0, -1));
+        List<Point3D> intersections = geometries.findIntersections(ray);
+        assertEquals("Some shapes are intersected",2, intersections.size());
+
+        // =============== Boundary Values Tests ==================
+
+        //TC02: No shape is intersected
+        assertNull( "No shape is intersected",geometries.findIntersections(new Ray(
+                        new Point3D(8, 8, 8),
+                        new Vector(0, 0, 1))));
+
+        //TC03: Only one shape is intersected
+        intersections = geometries.findIntersections(new Ray(
+                new Point3D(0, 6, 0),
+                new Vector(0, 1, 0)));
+        assertEquals("Only one shape is intersected",1, intersections.size());
+
+
+        //TC04: All shapes are intersected
+        sphere = new Sphere(new Point3D(3, 0, -3), 2);
+        geometries.add(sphere);
+        intersections = geometries.findIntersections(ray);
+        assertEquals("Some shapes are intersected",4, intersections.size());
+
+        //TC05: Collection of bodies is empty
+        geometries = new Geometries();
+        assertNull("No intersection points",geometries.findIntersections(new Ray(
+                        new Point3D(0, 0, 0),
+                        new Vector(0, 0, 1))));
+
+
+    }
+		
+}
diff --git a/src/unittests/PlaneTests.java b/src/unittests/PlaneTests.java
index 22d935e..e50ee3e 100644
--- a/src/unittests/PlaneTests.java
+++ b/src/unittests/PlaneTests.java
@@ -5,6 +5,8 @@
 
 import static org.junit.Assert.*;
 
+import java.util.List;
+
 import org.junit.Test;
 
 import geometries.Plane;
@@ -56,4 +58,67 @@
 
 	}
 
+	/**
+	 * Test method for {@link geometries.Plane#findIntersections(primitives.Ray)}.
+	 */
+	@Test
+	public void testFindIntersections() {
+		Plane plane = new Plane(new Point3D(1, 0, 0),
+				new Point3D(0, 1, 0),
+				new Point3D(0, 0, 1));
+		
+		// ============ Equivalence Partitions Tests ==============
+
+		// TC01: Ray intersects the plane (1 point)
+		Point3D p1 = new Point3D(1, 0, 0);
+		List<Point3D> result = plane.findIntersections(new Ray(
+				new Point3D(-1, 0, 0),
+				new Vector(1, 0, 0)));
+		assertEquals("Result is wrong", 1, result.size());
+		assertEquals("Ray intersects the plane", List.of(p1), result);
+
+		// TC02: Ray does not intersect the plane (0 point)
+		assertNull("Ray not intersects the plane",
+				plane.findIntersections(new Ray(
+						new Point3D(-1, 0, 0),
+						new Vector(-1, -1, 0))));
+
+		// =============== Boundary Values Tests ==================
+
+		// **** Group: Ray is parallel to the plane
+		// TC03: The ray included in the plane
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(-1, 0, 0),
+				new Vector(1, -1, 0))));
+
+		// TC04: The ray not included in the plane
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(-1, 0, 0),
+				new Vector(-2, 0, 0))));
+
+		// **** Group: Ray is orthogonal to the plane
+		// TC05: The point before the plane
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(-1, 0, 0), 
+				new Vector(0, -2, 0))));
+		// TC06: The point in the plane
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(0, 0, 1),
+				new Vector(1, 1, 1))));
+		// TC07: The point after the plane
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(3, 2, 2),
+				new Vector(1, 1, 1))));
+
+		// **** Group: Ray is neither orthogonal nor parallel to the plane
+		// TC08: The ray begins at the plane (p0 is in the plane, but not the ray)
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(1.5, 1.5, 0), 
+				new Vector(2, 2, -3))));
+		// TC09: The ray begins in the same point which appears as reference point in
+		// the plane (Q)
+		assertNull("Ray not intersects the plane",plane.findIntersections(new Ray(
+				new Point3D(1, 0, 0),
+				new Vector(1, 1, -2))));
+	}
 }
diff --git a/src/unittests/PolygonTests.java b/src/unittests/PolygonTests.java
index 1eb8249..677c937 100644
--- a/src/unittests/PolygonTests.java
+++ b/src/unittests/PolygonTests.java
@@ -4,6 +4,9 @@
 package unittests;
 
 import static org.junit.Assert.*;
+
+import java.util.List;
+
 import org.junit.Test;
 
 import geometries.*;
@@ -86,10 +89,60 @@
     public void testGetNormal() {
         // ============ Equivalence Partitions Tests ==============
         // TC01: There is a simple single test here
-        Polygon pl = new Polygon(new Point3D(0, 0, 1), new Point3D(1, 0, 0), new Point3D(0, 1, 0),
+        Polygon pl = new Polygon(new Point3D(0, 0, 1),
+        		new Point3D(1, 0, 0),
+        		new Point3D(0, 1, 0),
                 new Point3D(-1, 1, 1));
         double sqrt3 = Math.sqrt(1d / 3);
-        assertEquals("Bad normal to trinagle", new Vector(sqrt3, sqrt3, sqrt3), pl.getNormal(new Point3D(0, 0, 1)));
+        assertEquals("Bad normal to trinagle", 
+        		new Vector(sqrt3, sqrt3, sqrt3),
+        		pl.getNormal(new Point3D(0, 0, 1)));
+    }
+      
+        /**
+         * Test method for {@link geometries.Polygon#findIntersections(primitives.Point3D)}.
+         */
+        @Test
+        public void findIntersections() {
+             Polygon pl = new Polygon(
+                     new Point3D(2,0,0),
+                     new Point3D(1, 1, 0),
+                     new Point3D(3,2, 0),
+                     new Point3D(5, 1, 0));
+
+             // ============ Equivalence Partitions Tests ==============
+             //TC01: The point inside the polygon (1 point)
+             Point3D p1=new Point3D(2,1,0);
+             List<Point3D> result=pl.findIntersections(new Ray(
+                     new Point3D(2,1,1),new Vector(0,0,-1)));
+             assertEquals( "Wrong number of points",1, result.size());
+             assertEquals("Ray crosses polygon",List.of(p1), result);
+             //TC02: The point outside the polygon, against edge (0 points)
+             assertNull( "Ray not intersects the polygon",pl.findIntersections(new Ray(
+                             new Point3D(2, 2, 0),
+                             new Vector(0, 0, -1))));
+
+             //TC03: The point outside the polygon, against vertex (0 points)
+             assertNull("Ray not intersects the polygon",pl.findIntersections(new Ray(
+                             new Point3D(0.5, 1.0, 0),
+                             new Vector(0, 0, -1))));
+
+             // =============== Boundary Values Tests ==================
+             //TC04: The point on edge (0 points)
+             assertNull("Ray not intersects the polygon",pl.findIntersections(new Ray(
+                             new Point3D(1.5, 1.25, 1),
+                             new Vector(0, 0, -1))));
+             //TC05: The point in vertex (0 points)
+             assertNull("Ray not intersects the polygon",pl.findIntersections(new Ray(
+                             new Point3D(1, 1.0, 0),
+                             new Vector(0, 0, -1))));
+             //TC06: The point on edge's continuation (0 points)
+             assertNull("Ray not intersects the polygon",pl.findIntersections(new Ray(
+                             new Point3D(4, 3.0, 1),
+                             new Vector(0, 0, -1))));
+
+
+         
     }
 
 }
diff --git a/src/unittests/SphereTests.java b/src/unittests/SphereTests.java
index 9426504..277ffcf 100644
--- a/src/unittests/SphereTests.java
+++ b/src/unittests/SphereTests.java
@@ -4,10 +4,14 @@
 package unittests;
 
 import static org.junit.Assert.*;
+
+import java.util.List;
+
 import org.junit.Test;
 
 import geometries.Sphere;
 import primitives.*;
+import static primitives.Point3D.ZERO;
 
 /**
  * @author Adiel
@@ -22,10 +26,127 @@
 	public void testGetNormal() {
 
 		// ============ Equivalence Partitions Tests ==============
-		Sphere sp = new Sphere(new Point3D(0, 0, 1), 5);
+		Sphere sp = new Sphere(new Point3D(0, 0, 1), 1d);
 		double sqrt2 = Math.sqrt(2);
 		// Standard normal test
-		assertEquals("Bad normal to sphere", new Vector(1 / sqrt2, 0, -1 / sqrt2), sp.getNormal(new Point3D(1, 0, 0)));
+		assertEquals("Bad normal to sphere", new Vector(1 / sqrt2, 0, -1 / sqrt2),
+				sp.getNormal(new Point3D(1, 0, 0)));
+	}
+
+	/**
+	 * Test method for
+	 * {@link geometries.Sphere#findIntersections(primitives.Point3D)}.
+	 */
+	@Test
+	public void testFindIntersections() {
+		Sphere sphere = new Sphere(new Point3D(1, 0, 0), 1d);
+
+		// ============ Equivalence Partitions Tests ==============
+
+		// TC01: Ray's line is outside the sphere (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(new Point3D(-1, 0, 0), 
+						new Vector(1, 1, 0))));
+
+		// TC02: Ray starts before and crosses the sphere (2 points)
+		Point3D p1 = new Point3D(0.0651530771650466, 0.355051025721682, 0);
+		Point3D p2 = new Point3D(1.53484692283495, 0.844948974278318, 0);
+		List<Point3D> result = sphere.findIntersections(new Ray(new Point3D(-1, 0, 0),
+				new Vector(3, 1, 0)));
+		assertEquals("Wrong number of points", 2, result.size());
+		if (result.get(0).getX() > result.get(1).getX())
+			result = List.of(result.get(1), result.get(0));
+		assertEquals("Ray crosses sphere", List.of(p1, p2), result);
+
+		// TC03: Ray starts inside the sphere (1 point)
+		Point3D p3 = new Point3D(1.6851646544245034, 0.7283882181415011, 0);
+		List<Point3D> result1 = sphere.findIntersections(new Ray(new Point3D(1, 0.5, 0),
+				new Vector(3, 1, 0)));
+		assertEquals("Wrong number of points", 1, result1.size());
+		assertEquals("Ray coming out of a sphere", List.of(p3), result1);
+
+		// TC04: Ray starts after the sphere (0 points)
+		assertNull("Ray's line after the sphere",
+				sphere.findIntersections(new Ray(new Point3D(-1, 0, 0),
+						new Vector(-2, -1, 0))));
+
+		// =============== Boundary Values Tests ==================
+
+		// **** Group: Ray's line crosses the sphere (but not the center)
+		// TC11: Ray starts at sphere and goes inside (1 points)
+		Point3D p4 = new Point3D(1.6851646544245034, 0.7283882181415011, 0);
+		List<Point3D> result2 = sphere.findIntersections(new Ray(
+				new Point3D(0.4, 0.5, 0), new Vector(3, 1, 0)));
+		assertEquals("Wrong number of points", 1, result2.size());
+		assertEquals("Ray coming out of a sphere", List.of(p4), result1);
+
+		// TC12: Ray starts at sphere and goes outside (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(new Point3D(0, 0, 1),
+						new Vector(-1, 0, 0))));
+
+		// **** Group: Ray's line goes through the center
+		// TC13: Ray starts before the sphere (2 points)
+		Point3D p6=new Point3D(2, 0, 0);
+		
+		List<Point3D> result3 = sphere.findIntersections(new Ray(new Point3D(2.5, 0, 0), 
+				new Vector(-1, 0, 0)));
+		assertEquals("Wrong number of points", 2, result3.size());
+		if (result3.get(0).getX() > result3.get(1).getX())
+			result3 = List.of(result3.get(1), result3.get(0));
+		assertEquals("Ray crosses sphere", List.of(ZERO, p6), result3);
+
+		// TC14: Ray starts at sphere and goes outside (1 points)
+		List<Point3D> result4 = sphere.findIntersections(new Ray(new Point3D(0.4, 0, 0),
+				new Vector(-1, 0, 0)));
+		assertEquals("Wrong number of points", 1, result4.size());
+		assertEquals("Ray coming out of a sphere", List.of(ZERO), result4);
+
+		// TC15: Ray starts inside (1 points)
+		List<Point3D> result5 = sphere.findIntersections(new Ray(new Point3D(2, 0, 0),
+				new Vector(-1, 0, 0)));
+		assertEquals("Wrong number of points", 1, result5.size());
+		assertEquals("Ray coming out of a sphere", List.of(ZERO), result5);
+
+		// TC16: Ray starts at the center (1 points)
+		List<Point3D> result6 = sphere.findIntersections(new Ray(new Point3D(1, 0, 0),
+				new Vector(-1, 0, 0)));
+		assertEquals("Wrong number of points", 1, result6.size());
+		assertEquals("Ray coming out of a sphere", List.of(ZERO), result6);
+
+		// TC17: Ray starts at sphere and goes outside (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(
+						new Point3D(0, 0, 1), new Vector(-1, 0, 1))));
+
+		// TC18: Ray starts after sphere (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(
+						new Point3D(-1, 0, 0), new Vector(-2, 0, 0))));
+
+		// **** Group: Ray's line is tangent to the sphere (all tests 0 points)
+		// TC19: Ray starts before the tangent point (0 points)
+		assertNull("Ray's line out of sphere", sphere.findIntersections(new Ray( new
+		  Point3D(0, 0, -1), new Vector(0, 1, 0))));
+		 
+		  
+		 
+		// TC20: Ray starts at the tangent point (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(
+						new Point3D(1, 1, 0), new Vector(3, 2, 1))));
+
+		// TC21: Ray starts after the tangent point (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(new Ray(
+						new Point3D(1, 1, 0), new Vector(1, 0, 0))));
+
+		// **** Group: Special cases
+		// TC19: Ray's line is outside, ray is orthogonal to ray start to sphere's
+		// center line (0 points)
+		assertNull("Ray's line out of sphere",
+				sphere.findIntersections(
+						new Ray(new Point3D(-1, 0, 0), new Vector(-1, 1, 0))));
 	}
 
 }
diff --git a/src/unittests/TriangleTests.java b/src/unittests/TriangleTests.java
index 609c741..d1ed1ad 100644
--- a/src/unittests/TriangleTests.java
+++ b/src/unittests/TriangleTests.java
@@ -4,6 +4,9 @@
 package unittests;
 
 import static org.junit.Assert.*;
+
+import java.util.List;
+
 import org.junit.Test;
 
 import geometries.Triangle;
@@ -25,7 +28,52 @@
 		Triangle tr = new Triangle(new Point3D(0, 0, 1), new Point3D(1, 0, 0), new Point3D(0, 1, 0));
 		double sqrt3 = Math.sqrt(1d / 3);
 		//Standard normal test
-		assertEquals("Bad normal to triangle", new Vector(sqrt3, sqrt3, sqrt3), tr.getNormal(new Point3D(0, 0, 1)));
+		assertEquals("Bad normal to triangle",
+				new Vector(sqrt3, sqrt3, sqrt3), 
+				tr.getNormal(new Point3D(0, 0, 1)));
 	}
+	
+	/**
+	 * Test method for {@link geometries.Polygon#getNormal(primitives.Point3D)}.
+	 */
+	 @Test
+	   public void findIntersections() {
+	        Triangle tr=new Triangle(
+	                new Point3D(1,0,0),
+	                new Point3D(3,2,0),
+	                new Point3D(5,0, 0));
+
+	        // ============ Equivalence Partitions Tests ==============
+	        //TC01: The point inside the triangle (1 point)
+	        Point3D p1=new Point3D(2,0.5,0);
+	        List<Point3D> result=tr.findIntersections(new Ray(
+	                new Point3D(2,0.5,1),new Vector(0,0,-1)));
+	        assertEquals("Wrong number of points",1, result.size());
+	        assertEquals( "Ray crosses triangle",List.of(p1), result);
+	        //TC02: The point outside the triangle, against edge
+	        assertNull("Ray not intersects the triangle",tr.findIntersections(new Ray(
+	                        new Point3D(1.5, 1.0, 0),
+	                        new Vector(0, 0, -1))));
+	        //TC03: The point outside the triangle, against vertex (0 point)
+	        assertNull("Ray not intersects the triangle",tr.findIntersections(new Ray(
+	                        new Point3D(0.5, 0, 0),
+	                        new Vector(0, 0, -1))));
+
+	        // =============== Boundary Values Tests ==================
+	        //TC04: The point on edge (0 points)
+	        assertNull("Ray not intersects the triangle",tr.findIntersections(new Ray(
+	                        new Point3D(2, 0, 0),
+	                        new Vector(0, 0, -1))));
+
+	        //TC05: The point in vertex (0 points)
+	        assertNull( "Ray not intersects the triangle",tr.findIntersections(new Ray(
+	                        new Point3D(3, -2, 0),
+	                        new Vector(0, 0, -1))));
+
+	        //TC06: The point on edge's continuation (0 points)
+	        assertNull("Ray not intersects the triangle",tr.findIntersections(new Ray(
+	                        new Point3D(6, 0, 0),
+	                        new Vector(0, 0, -1))));
+	    }
 
 }